提到MySQL優化,索引優化是必不可少的。其中一種優化方式 ——索引優化,添加合適的索引可以讓項目的併發能力和抗壓能力獲得明顯的提高。mysql
咱們知道項目性能的瓶頸主要是在"查(select)"語句,要提高"查"這一性能,mysql索引是必不可少的。接下來總結一下mysql常見的四種索引算法
一. 四種索引(主鍵索引/普通索引/全文索引/惟一索引)sql
1.索引的添加 數據庫
1.1主鍵索引的添加數據結構
當一張表,把某個列設爲主鍵的時候,則該列就是主鍵索引併發
create table a( id int primary key auto_increment, name varchar(20) not null default '' ); //這裏id就是表的主鍵
若是當建立表時沒有指定主鍵索引,也能夠在建立表以後添加:性能
alter table table_name add primary key (column name);mysql索引
1.2普通索引優化
普通索引通常是在建表後再添加的,this
create index 索引名 on table_name(column1,column2);
alter table table_name add index 索引名(column1,column2);
1.3全文索引
首先,全文索引主要針對文本文件,好比文章,標題,全文索引只有MyISAM有效(mysql5.6以後InnoDB也支持了全文索引)
create table c( id int primary key auto_increment , title varchar(20), content text, fulltext(title,content) )engine=myisam charset utf8; insert into c(title,content) values ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');
使用全文索引常見的錯誤:
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惟一索引
create table d(id int primary key auto_increment , name varchar(32) unique)
d表中name就是惟一索引,惟一索引能夠有多個null,不能是重複的內容
相比主鍵索引,主鍵字段不能爲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:這個值越高,說明查詢低效。