MySQL優化----索引
阿新 • • 發佈:2019-01-11
一、主鍵索引
建立主鍵索引
索引名規範:ix_表名_欄位名
語法:
create index 索引名 on 表名(欄位名)
檢視索引是否建立成功
show index from 表名\G;
二、全文索引
應用場景:
建立全文索引
#建立全文索引
CREATE TABLE articles(
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title,body)
)engine = myisam charset=utf8;
#插入語句
INSERT INTO articles(title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we well show ...'),
('MySQL Security','When configured properly,MySQL ...'),
('MySQL vs.YourSQL','In the following database comparison ...' );
檢視索引是否建立成功
show index from articles \G;
使用索引
語法及使用索引查詢
#語法
select * from 表名 where match(欄位名,...) against('關鍵字');
#使用索引查詢
select * from articles where match(title,body) against('database');
#使用explain分析sql語句
explain select * from articles where match(title,body) against('database');
輸入以上兩個命令:
檢視是否使用索引
“\G” 的作用是將查到的結構旋轉90度變成縱向
explain select * from articles where match(title,body) against('database')\G;
如果你按照平時我們查關鍵字的方法模糊查詢,是沒有使用索引的,看下圖;
#使用like關鍵字模糊查詢
explain select * from articles where body like 'database%' \G;
查詢文章表
然後使用索引查詢關鍵字‘mysql’,看看有什麼變化?
注意:這裡查詢關鍵字是不區分大小寫的;
是不是很奇怪,分明有五條包含‘mysql’的內容,但為什麼查出是空的?
接下來再看,關鍵字“database”在每一行出現的可能性:
select match(title,body) against('database') from articles;
分別在第一行與第五行,‘database’出現的機率為38%
作為對比,再來看,關鍵字“mysql”在每一行出現的可能性:
select match(title,body) against('mysql') from articles;
奇怪了,反而在每一行都出現的‘mysql’,出現的可能性竟為0。
關鍵字“mysql”沒有建立索引,是因為:
這個關鍵字佔全文50%的比例,所以不能建立索引。
總結
1、 全文索引必須是myisam儲存引擎。
2、 MySQL自己的fulltext是不支援中文的,用sphinx(coreseek)技術去處理中文。
3、 語法:match(欄位,…) against (‘關鍵字’)
4、 在50%以上都出現的關鍵字,是不會做全文索引的,(這個特點就告訴我們,要做全文索引必須是海量資料)。這個詞叫停止詞(停止字)。