在實際開發(fā)中使用數(shù)據(jù)庫時,難免會遇到一些大表數(shù)據(jù),對這些數(shù)據(jù)進行查詢時,有時候SQL會查詢得特別慢,這時候,有經(jīng)驗的老師傅會告訴你,你看一下哪幾個字段查的多,加一個索引就好了。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設、溫泉網(wǎng)站維護、網(wǎng)站推廣。
那么,怎么合理地建立索引呢?這里分享一下我的一些經(jīng)驗,如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創(chuàng)建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發(fā)完成后,分析一下,去針對大多數(shù)的查詢,建立聯(lián)合索引。
2、使用聯(lián)合索引盡量覆蓋多的條件
這是說在一個慢sql里假如有五個where ,一個 order by ,那么我們的聯(lián)合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數(shù)字段不需要索引
這個意思是,如果一張表里某個字段的值只有那么幾個,那么你針對這個字段建立的索引其實沒什么意義,比如說,一個性別字段就兩種結(jié)果,你建了索引,排序也沒什么意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數(shù)大的數(shù)據(jù)去建立,能最大化地利用索引
4、長字符串可以使用前綴索引
我們建立索引的字段盡量選擇字段類型較小的,比如一個varchar(20)和varchar(256)的,我們在20的上面建立的索引和在256上就有明顯的差距(字符串那么長排序也不好排呀,唉)。
當然,如果一定是要對varchar(256)建立索引,我們可以選擇里面的前20個字符放在索引樹里(這里的20不絕對,選擇能盡量分辨數(shù)據(jù)的最小字符字段設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字符進行搜索,但前綴索引無法適用于order by 和 group by。
5、對排序字段設計索引的優(yōu)先級低
如果一個SQL里我們出現(xiàn)了范圍查找,后邊又跟著一個排序字段,那么我們優(yōu)先給范圍查找的字段設置索引,而不是優(yōu)先排序。
6、如果出現(xiàn)慢SQL,可以設計一個只針對該條SQL的聯(lián)合索引。
不過慢SQL的優(yōu)化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結(jié)果,再針對結(jié)果去做相應的改進。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執(zhí)行查詢會返回執(zhí)行計劃的信息,而不是 執(zhí)行這條SQL。
我們可以通過查看索引的屬性來判斷創(chuàng)建索引的方法。
查看索引的語法格式如下:
SHOW INDEX FROM 表名 [ FROM 數(shù)據(jù)庫名]
語法說明如下:
表名:指定需要查看索引的數(shù)據(jù)表名。
數(shù)據(jù)庫名:指定需要查看索引的數(shù)據(jù)表所在的數(shù)據(jù)庫,可省略。比如,SHOW INDEX FROM student FROM test; 語句表示查看 test 數(shù)據(jù)庫中 student 數(shù)據(jù)表的索引。
示例
使用 SHOW INDEX 語句查看《MySQL創(chuàng)建索引》一節(jié)中 tb_stu_info2 數(shù)據(jù)表的索引信息,SQL 語句和運行結(jié)果如下所示。
mysql SHOW INDEX FROM tb_stu_info2\G
1. row
Table: tb_stu_info2
Non_unique: 0
Key_name: height
Seq_in_index: 1
Column_name: height
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.03 sec)
其中各主要參數(shù)說明如下:
參數(shù) 說明
Table 表示創(chuàng)建索引的數(shù)據(jù)表名,這里是 tb_stu_info2 數(shù)據(jù)表。
Non_unique 表示該索引是否是唯一索引。若不是唯一索引,則該列的值為 1;若是唯一索引,則該列的值為 0。
Key_name 表示索引的名稱。
Seq_in_index 表示該列在索引中的位置,如果索引是單列的,則該列的值為 1;如果索引是組合索引,則該列的值為每列在索引定義中的順序。
Column_name 表示定義索引的列字段。
Collation 表示列以何種順序存儲在索引中。在 MySQL 中,升序顯示值“A”(升序),若顯示為 NULL,則表示無分類。
Cardinality 索引中唯一值數(shù)目的估計值?;鶖?shù)根據(jù)被存儲為整數(shù)的統(tǒng)計數(shù)據(jù)計數(shù),所以即使對于小型表,該值也沒有必要是精確的。基數(shù)越大,當進行聯(lián)合時,MySQL 使用該索引的機會就越大。
Sub_part 表示列中被編入索引的字符的數(shù)量。若列只是部分被編入索引,則該列的值為被編入索引的字符的數(shù)目;若整列被編入索引,則該列的值為 NULL。
Packed 指示關鍵字如何被壓縮。若沒有被壓縮,值為 NULL。
Null 用于顯示索引列中是否包含 NULL。若列含有 NULL,該列的值為 YES。若沒有,則該列的值為 NO。
Index_type 顯示索引使用的類型和方法(BTREE、FULLTEXT、HASH、RTREE)。
Comment 顯示評注。
1.添加PRIMARY KEY(主鍵索引)
mysqlALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysqlALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysqlALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
下面是更加詳細的方法
MySQL中可以使用alter table這個SQL語句來為表中的字段添加索引。
使用alter table語句來為表中的字段添加索引的基本語法是:
ALTER TABLE 表名 ADD INDEX (字段);
我們來嘗試為test中t_name字段添加一個索引。
mysql alter table test add index(t_name);
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
執(zhí)行成功后,我們來看看結(jié)果。
mysql describe test;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| t_id | int(11) | YES | | NULL | |
| t_name | varchar(50) | NO | MUL | NULL | |
| t_password | char(32) | YES | | NULL | |
| t_birth | date | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
結(jié)果可以看出,t_name字段的Key這一欄由原來的空白變成了MUL。這個MUL是什么意思呢?簡單解釋一下:如果Key是MUL,那么該列的值可以重復,該列是一個非唯一索引的前導列(第一列)或者是一個唯一性索引的組成部分但是可以含有空值NULL。
網(wǎng)頁名稱:mysql中怎么創(chuàng)建索引 mysql創(chuàng)建索引方式
網(wǎng)站鏈接:http://muchs.cn/article36/ddipopg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)建站、商城網(wǎng)站、定制開發(fā)、網(wǎng)站建設、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)