1. 程式人生 > >mysql優化 索引基本用法

mysql優化 索引基本用法

說起提高資料庫效能,索引是最物美價廉的東西了。不用加記憶體,不用改程式,不用調sql,只要執行個正確的’create index’,查詢速度就可能提高百倍千倍,這可真有誘惑力。可是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫操作,增加了大量的I/O。

使用索引為什麼會快?

  • 索引的代價

  • 磁碟佔用

  • 對dml(update delete insert)語句的效率影響,變慢

索引的型別

  • 主鍵索引,主鍵自動的為主索引 (型別Primary)

  • 唯一索引 (UNIQUE)

  • 普通索引 (INDEX)

  • 全文索引與停止詞 (FULLTEXT) [適用於MyISAM] sphinx

    + 中文分詞 coreseek [sphinx 的中文版 ]

  • 複合索引

哪些列上適合新增索引

  • 較頻繁的作為查詢條件欄位應該建立索引

    select * from emp where empno = 1

  • 唯一性太差的欄位不適合單獨建立索引,即使頻繁作為查詢條件

    select * from emp where sex = ‘男‘

  • 更新非常頻繁的欄位不適合建立索引

    select * from emp where logincount = 1

  • 不會出現在WHERE子句中欄位不該建立索引

索引的使用

建立索引

create [UNIQUE|FULLTEXT]  index index_name on tbl_name
(col_name [(length)] [ASC | DESC] , …..);
#或則
alter table table_name ADD INDEX [index_name] (index_col_name,...);

新增主鍵(索引)

 #新增聯合主鍵
 ALTER TABLE 表名 ADD PRIMARY KEY(列名,..); 

ALTER TABLE 表名 ``ADD PRIMARY KEY``(列名,..);聯合主鍵

刪除索引

DROP INDEX index_name ON tbl_name;
#或則
alter table table_name drop index index_name;

刪除主鍵(索引)比較特別:

alter
table t_b drop primary key;

查詢索引:(均可)

show index(index_name) from table_name;
#或則
show index_name from table_name;
#或則
desc table_Name;

修改索引,我們一般是先刪除在重新建立.

查詢要使用索引最重要的條件是查詢條件中需要使用索引。

下列幾種情況下有可能使用到索引:

  • 對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。

  • 對於使用like的查詢,查詢如果是 ‘%aaa’ 不會使用到索引,‘aaa%’ 會使用到索引

下列的表將不使用索引:

  1. 如果條件中有or,即使其中有條件帶索引也不會使用。

  2. 對於多列索引,不是使用的第一部分,則不會使用索引。

  3. like查詢是以%開頭

  4. 如果列型別是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引。(新增時,字串必須’’)

  5. 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

檢視索引的使用情況

show status like ‘Handler_read%’;

大家可以注意:handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
handler_read_rnd_next:這個值越高,說明查詢低效。

簡述mysql四種索引的區別

PRIMARY 索引 =》在主鍵上自動建立

UNIQUE 索引=> 只要是UNiQUE 就是Unique索引.

INDEX 索引=>就是普通索引

FULLTEXT => 只在MYISAM 儲存引擎支援, 目的是全文索引,在內容系統中用的多, 在全英文網站用多(英文詞獨立). 中文資料不常用,意義不大 國內全文索引通常 使用 sphinx 來完成.

複合索引

create index 索引名 on 表名(列1,列2);

全文索引案例

1.建立表

create table news(id int , title varchar(32),con varchar(1024)) engine=MyISAM;

2.建立全文索引

create fulltext index ful_inx on news (con);

3.插入資料

這裡要注意,對於常見的英文 fulltext 不會匹配,而且插入的語句本身是正確的.

4.看看匹配度

mysql> select match(con) against('poverty') from news;

+-------------------------------+

| match(con) against('poverty') |

+-------------------------------+

|                             0 |

|                             0 |

|                             0 |

|            0.9853024482727051 |

+-------------------------------+

0表示沒有匹配到,或者你的詞是停止詞,是不會建立索引的.

使用全文索引,不能使用like語句,這樣就不會使用到全文索引了.

全文索引查詢

select * from `tableName` where match(欄位1,欄位2...) against(‘關鍵詞’);