提到mysql優化,索引優化是必不可少的。其中一種優化方式 ——索引優化,添加合適的索引可以讓項目的併發能力和抗壓能力獲得明顯的提高。html
咱們知道項目性能的瓶頸主要是在"查(select)"語句,要提高"查"這一性能,mysql索引是必不可少的。接下來總結一下mysql常見的四種索引mysql
一. 四種索引(主鍵索引/普通索引/全文索引/惟一索引)算法
1.索引的添加 sql
1.1主鍵索引的添加數據庫
當一張表,把某個列設爲主鍵的時候,則該列就是主鍵索引mysql優化
若是當建立表時沒有指定主鍵索引,也能夠在建立表以後添加:併發
alter table table_name add primary key (column name);post
1.2普通索引性能
普通索引通常是在建表後再添加的,mysql索引
create index 索引名 on table_name(column1,column2);alter table table_name add index 索引名(column1,column2);
1.3全文索引
首先,全文索引主要針對文本文件,好比文章,標題,全文索引只有MyISAM有效(mysql5.6以後InnoDB也支持了全文索引)
使用全文索引常見的錯誤:
select * from c where content like "%mysql%";
這裏並不會使用全文索引,能夠用explain進行查看。正確用法:select * from c where match(title,content) against ('MYSQL');
備註:
1. 在mysql中fulltext 索引只針對 myisam生效
2. mysql本身提供的fulltext針對英文生效->sphinx(coreseek)技術處理中文
3. 使用方法是 match(字段名..) against(‘關鍵字’)
1.4惟一索引
相比主鍵索引,主鍵字段不能爲null,也不能重複
2. 查詢索引
show indexes from table_name;
show keys from table_name;
3.刪除索引
alter table table_name drop index 索引名;
二. 索引的機制
2.1 爲何咱們添加完索引後查詢速度爲變快?
傳統的查詢方法,是按照表的順序遍歷的,不論查詢幾條數據,mysql須要將表的數據從頭至尾遍歷一遍
在咱們添加完索引以後,mysql通常經過BTREE算法生成一個索引文件,在查詢數據庫時,找到索引文件進行遍歷(折半查找大幅查詢效率),找到相應的鍵從而獲取數據
2.2 索引的代價
1. 建立索引是爲產生索引文件的,佔用磁盤空間
2. 索引文件是一個二叉樹類型的文件,可想而知咱們的dml操做一樣也會對索引文件進行修改,因此性能會降低
2.3 在哪些column上使用索引?
1 .較頻繁的做爲查詢條件字段應該建立索引
2. 惟一性太差的字段不適合建立索引,儘管頻繁做爲查詢條件,例如gender性別字段
3. 更新很是頻繁的字段不適合做爲索引
4.不會出如今where子句中的字段不應建立索引
總結: 知足如下條件的字段,才應該建立索引.
a: 確定在where條常常使用 b: 該字段的內容不是惟一的幾個值 c: 字段內容不是頻繁變化
三.索引使用注意事項
1.對於建立的多列索引,只要查詢條件使用了最左邊的列,索引通常就會被使用。
好比咱們對title,content 添加了複合索引
select * from table_name where title = 'test';會用到索引
select * from table_name where content = 'test';不會用到索引
2.對於使用like的查詢,查詢若是是 ‘%a’不會使用到索引 ,而 like 'a%'就會用到索引。最前面不能使用%和_這樣的變化值
3.若是條件中有or,即便其中有條件帶索引也不會使用。
4.若是列類型是字符串,那必定要在條件中將數據使用引號引用起來。
四.如何查看索引使用的狀況:
show status like‘Handler_read%’;
注意:
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
handler_read_rnd_next:這個值越高,說明查詢低效。