我們可以通過查看索引的屬性來判斷創(chuàng)建索引的方法。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括城廂網(wǎng)站建設(shè)、城廂網(wǎng)站制作、城廂網(wǎng)頁制作以及城廂網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,城廂網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到城廂省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
查看索引的語法格式如下:
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 語句和運(yùn)行結(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ù)目的估計(jì)值。基數(shù)根據(jù)被存儲為整數(shù)的統(tǒng)計(jì)數(shù)據(jù)計(jì)數(shù),所以即使對于小型表,該值也沒有必要是精確的?;鶖?shù)越大,當(dāng)進(jìn)行聯(lián)合時(shí),MySQL 使用該索引的機(jī)會(huì)就越大。
Sub_part 表示列中被編入索引的字符的數(shù)量。若列只是部分被編入索引,則該列的值為被編入索引的字符的數(shù)目;若整列被編入索引,則該列的值為 NULL。
Packed 指示關(guān)鍵字如何被壓縮。若沒有被壓縮,值為 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` )
下面是更加詳細(xì)的方法
MySQL中可以使用alter table這個(gè)SQL語句來為表中的字段添加索引。
使用alter table語句來為表中的字段添加索引的基本語法是:
ALTER TABLE 表名 ADD INDEX (字段);
我們來嘗試為test中t_name字段添加一個(gè)索引。
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。這個(gè)MUL是什么意思呢?簡單解釋一下:如果Key是MUL,那么該列的值可以重復(fù),該列是一個(gè)非唯一索引的前導(dǎo)列(第一列)或者是一個(gè)唯一性索引的組成部分但是可以含有空值NULL。
在實(shí)際開發(fā)中使用數(shù)據(jù)庫時(shí),難免會(huì)遇到一些大表數(shù)據(jù),對這些數(shù)據(jù)進(jìn)行查詢時(shí),有時(shí)候SQL會(huì)查詢得特別慢,這時(shí)候,有經(jīng)驗(yàn)的老師傅會(huì)告訴你,你看一下哪幾個(gè)字段查的多,加一個(gè)索引就好了。
那么,怎么合理地建立索引呢?這里分享一下我的一些經(jīng)驗(yàn),如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創(chuàng)建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進(jìn)行增刪改時(shí),索引樹也要同樣地進(jìn)行維護(hù)。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發(fā)完成后,分析一下,去針對大多數(shù)的查詢,建立聯(lián)合索引。
2、使用聯(lián)合索引盡量覆蓋多的條件
這是說在一個(gè)慢sql里假如有五個(gè)where ,一個(gè) order by ,那么我們的聯(lián)合索引盡量覆蓋到這五個(gè)查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數(shù)字段不需要索引
這個(gè)意思是,如果一張表里某個(gè)字段的值只有那么幾個(gè),那么你針對這個(gè)字段建立的索引其實(shí)沒什么意義,比如說,一個(gè)性別字段就兩種結(jié)果,你建了索引,排序也沒什么意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數(shù)大的數(shù)據(jù)去建立,能最大化地利用索引
4、長字符串可以使用前綴索引
我們建立索引的字段盡量選擇字段類型較小的,比如一個(gè)varchar(20)和varchar(256)的,我們在20的上面建立的索引和在256上就有明顯的差距(字符串那么長排序也不好排呀,唉)。
當(dāng)然,如果一定是要對varchar(256)建立索引,我們可以選擇里面的前20個(gè)字符放在索引樹里(這里的20不絕對,選擇能盡量分辨數(shù)據(jù)的最小字符字段設(shè)計(jì)),類似這樣KEY index(name(20),age,job) ,索引只會(huì)對name的前20個(gè)字符進(jìn)行搜索,但前綴索引無法適用于order by 和 group by。
5、對排序字段設(shè)計(jì)索引的優(yōu)先級低
如果一個(gè)SQL里我們出現(xiàn)了范圍查找,后邊又跟著一個(gè)排序字段,那么我們優(yōu)先給范圍查找的字段設(shè)置索引,而不是優(yōu)先排序。
6、如果出現(xiàn)慢SQL,可以設(shè)計(jì)一個(gè)只針對該條SQL的聯(lián)合索引。
不過慢SQL的優(yōu)化,需要一步步去進(jìn)行分析,可以先用explain查看SQL語句的分析結(jié)果,再針對結(jié)果去做相應(yīng)的改進(jìn)。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關(guān)鍵字,MySQL 會(huì)在查詢上設(shè)置一個(gè)標(biāo)記,執(zhí)行查詢會(huì)返回執(zhí)行計(jì)劃的信息,而不是 執(zhí)行這條SQL。