mysql索引及优化
1.mysql索引
MySQL索引的建立對于MySQL的高效運(yùn)行是很重要的,索引可以大大提高M(jìn)ySQL的檢索速度。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
創(chuàng)建索引時,你需要確保該索引是應(yīng)用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實(shí)際上,索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點(diǎn):雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進(jìn)行INSERT、UPDATE和DELETE。因?yàn)楦卤頃r,MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。
建立索引會占用磁盤空間的索引文件。
2.索引類型
普通索引,唯一索引,主鍵索引,全文索引。
無論任何類型,都是通過建立關(guān)鍵字與位置的對應(yīng)關(guān)系來實(shí)現(xiàn)的。
以上類型的差異:對索引關(guān)鍵字的要求不同。
添加修改索引語法:ALTER TABLE tbl_name ADD INDEX index_name (column_list(length)): 添加普通索引,索引值可出現(xiàn)多次。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創(chuàng)建索引的值必須是唯一的(除了NULL外,NULL可能會出現(xiàn)多次)。 ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用于全文索引。刪除索引語法: ALTER TABLE tbl_name drop INDEX 索引名;查看索引 SHOW INDEX FROM tbl_name3.普通索引(index)
這是最基本的索引,它沒有任何限制,比如上文中為title字段創(chuàng)建的索引就是一個普通索引,MyIASM中默認(rèn)的BTREE類型的索引,也是我們大多數(shù)情況下用到的索引。
–修改表結(jié)構(gòu)的方式添加索引 ALTER TABLE tbl_name ADD INDEX index_name (column_list(length))例: CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, INDEX index_name (name(length)) ); ALTER TABLE mytable ADD INDEX index_name ON (name(length))4.唯一索引(unique index)
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式:
–修改表結(jié)構(gòu)的方式添加索引 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)例: CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, UNIQUE unique_name (name(length)) ); ALTER TABLE mytable ADD UNIQUE index_name ON (name(length))5.主鍵索引(primary key)
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引:
--添加修改索引 ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );當(dāng)然也可以用 ALTER 命令。記住:一個表只能有一個主鍵。
6.全文索引(fulltext key)
MySQL從3.23.23版開始支持全文索引和全文檢索;
--修改表結(jié)構(gòu)的方式添加索引 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) --創(chuàng)建表全文索引 CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, content TEXT PRIMARY KEY(ID),FULLTEXT(content) ); ALTER TABLE mytable ADD FULLTEXT index_content(content)使用全文索引常見的錯誤:
select * from mytable where content like "%mysql%";這里并不會使用全文索引,可以用explain進(jìn)行查看。正確用法:
select?*?from?mytable?where?match(title,content) against ('MYSQL');備注:
- 在mysql中fulltext 索引只針對 myisam生效
- mysql自己提供的fulltext針對英文生效->sphinx(coreseek)技術(shù)處理中文
- 使用方法是 match(字段名..) against(‘關(guān)鍵字’)
7.組合索引(非mysql索引類型)
平時用的SQL查詢語句一般都有比較多的限制條件,所以為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。
例如上表中針對title和time建立一個組合索引:ALTER TABLE mytable ADD INDEX index_name_content (name(50),content(10))。建立這樣的組合索引,其實(shí)是相當(dāng)于分別建立了下面兩組組合索引:
- name,content
- name
為什么沒有content這樣的組合索引呢?這是因?yàn)镸ySQL組合索引“最左前綴”的結(jié)果。簡單的理解就是只從最左面的開始組合。并不是只要包含這兩列的查詢都會用到該組合索引,如下面的幾個SQL所示:
–使用到上面的索引SELECT * FROM mytable WHREE name='測試' AND content='123345'; SELECT * FROM mytable WHREE name='測試';–不使用上面的索引 SELECT * FROM mytable WHREE content='123345';8.執(zhí)行計(jì)劃
可以使用explain語句去查看分析結(jié)果,而不是真正執(zhí)行該語句。
其中,
- select_type
- table:表名
- type
- possible_keys:查詢可能使用到的索引都會在這里列出來。
- key:查詢真正使用到的索引,select_type為index_merge時,這里可能出現(xiàn)兩個以上的索引,其他的select_type這里只會出現(xiàn)一個。
- key_len:
用于處理查詢的索引長度,如果是單列索引,那就整個索引長度算進(jìn)去,如果是多列索引,那么查詢不一定都能使用到所有的列,具體使用到了多少個列的索引,這里就會計(jì)算進(jìn)去,沒有使用到的列,這里不會計(jì)算進(jìn)去。
- ref:如果是使用的常數(shù)等值查詢,這里會顯示const,如果是連接查詢,被驅(qū)動表的執(zhí)行計(jì)劃這里會顯示驅(qū)動表的關(guān)聯(lián)字段,如果是條件使用了表達(dá)式或者函數(shù),或者條件列發(fā)生了內(nèi)部隱式轉(zhuǎn)換,這里可能顯示為func。
- rows:這里是執(zhí)行計(jì)劃中估算的掃描行數(shù),不是精確值。
- extra:這個列可以顯示的信息非常多,有幾十種,常用的有:
9.MySQL索引的優(yōu)化
比如我們對title,content 添加了復(fù)合索引
select * from table_name where title = 'test';會用到索引
select * from table_name where content = 'test';不會用到索引
- 12 小時前發(fā)布
總結(jié)
以上是生活随笔為你收集整理的mysql索引及优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis分页插件pageHelpe
- 下一篇: mysql中模糊查询的四种用法