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%’ 會使用到索引
下列的表將不使用索引:
如果條件中有or,即使其中有條件帶索引也不會使用。
對於多列索引,不是使用的第一部分,則不會使用索引。
like查詢是以%開頭
如果列型別是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引。(新增時,字串必須’’)
- 如果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(‘關鍵詞’);