1.查詢MySql系統(tǒng)變量:SHOW VARIABLES LIKE '%quer%';

2.查詢慢查詢數(shù)量: SHOW STATUS LIKE '%slow_queries%';
3.開啟慢日志: SET GLOBAL slow_query_log = ON;
開啟后通過 1步驟中的語句再次查詢可以看到 slow_query_log已經(jīng)是 on了

slow_query_log_file 可以找到慢日志文件的位置;
4.默認(rèn)慢查詢的時(shí)間為10s,改變慢查詢時(shí)間定義: SET GLOBAL long_query_time = 1;
5.如果有慢sql,可以通過慢日志定位sql,然后通過explain xxsql 來定位
index指的走了索引 ,all 指的該sql都是全表掃描,需要優(yōu)化,更多的參數(shù)意義,若有興趣,可以自行百度。
常見的優(yōu)化就是分析慢sql,合理創(chuàng)建索引,下面是一些常用到的。
1)創(chuàng)建索引
索引的創(chuàng)建可以在CREATE TABLE語句中進(jìn)行,也可以單獨(dú)用CREATE INDEX或ALTER TABLE來給表增加索引。以下命令語句分別提示了如何創(chuàng)建主鍵索引(PRIMARY KEY),聯(lián)合索引(UNIQUE)和普通索引(INDEX)的方法。
mysql>ALTER TABLE `table_name` ADD INDEX `index_name` (column list);
mysql>ALTER TABLE `table_name` ADD UNIQUE `index_name` (column list);
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY `index_name` (column list);
mysql>CREATE INDEX `index_name` ON `table_name` (column_list);
mysql>CREATE UNIQUE INDEX `index_name` ON `table_name` (column_list);
mysql>ALTER TABLE `article` ADD INDEX (`id`,`order_id`);給article表增加id索引,order_id索引
mysql>ALTER TABLE `article` ADD INDEX `id`;//給article表增加id索引
2)重建索引
重建索引在常規(guī)的數(shù)據(jù)庫維護(hù)操作中經(jīng)常使用。在數(shù)據(jù)庫運(yùn)行了較長(zhǎng)時(shí)間后,索引都有損壞的可能,這時(shí)就需要重建。對(duì)數(shù)據(jù)重建索引可以起到提高檢索效率。
mysql> REPAIR TABLE `table_name` QUICK;
3)查詢數(shù)據(jù)庫索引
mysql> SHOW INDEX FROM `table_name`;
4)刪除索引
刪除索引可以使用ALTER TABLE或DROP INDEX語句來實(shí)現(xiàn)。DROP INDEX可以在ALTER TABLE內(nèi)部作為一條語句處理,其格式如下:
mysql>DROP index `index_name` ON `table_name` (column list);
mysql>ALTER TABLE `table_name` DROP INDEX `index_name` (column list);
mysql>ALTER TABLE `table_name` DROP UNIQUE `index_name` (column list);
mysql>ALTER TABLE `table_name` DROP PRIMARY KEY `index_name` (column list);
在前面的三條語句中,都刪除了table_name中的索引index_name。而在最后一條語句中,只在刪除PRIMARY KEY索引中使用,因?yàn)橐粋€(gè)表只可能有一個(gè)PRIMARY KEY索引,因此也可不指定索引名。如果沒有創(chuàng)建PRIMARY KEY索引,但表具有一個(gè)或多個(gè)UNIQUE索引,則MySQL將刪除第一個(gè)UNIQUE索引。如果從表中刪除某列,則索引會(huì)受影響。對(duì)于多列組合的索引,如果刪除其中的某列,則該列也會(huì)從索引中刪除。如果刪除組成索引的所有列,則整個(gè)索引將被刪除。
5)強(qiáng)制使用索引
mysql>SELECT * FROM TABLE1 FORCE INDEX (索引名或PRIMARY) ;
6)聯(lián)合索引
mysql>alter table test add key id_a_b(a,b) ;
6.1)聯(lián)合索引的最左匹配原則:
對(duì)于聯(lián)合索引當(dāng)條件為 a=1 and b=1 則使用索引 ,當(dāng)a=1 時(shí)也使用索引 當(dāng)單獨(dú)使用b=1時(shí)則不使用索引。
MySql會(huì)一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如 a=3 and b=4 and c > 5 and d = 6 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引,則都可以用到,a,b,d的順序可以任意調(diào)整。
6.2) = 和 in 可以亂序,比如 a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意亂 序,mysql優(yōu)化器會(huì)幫你優(yōu)化成索引可以識(shí)別的形式。
6.3)聯(lián)合索引的最左匹配原則的成因
mysql創(chuàng)建復(fù)合索引的規(guī)則是首先會(huì)對(duì)復(fù)合索引的最左邊,也就是索引中的第一個(gè)字段進(jìn)行排序,在第一個(gè)字段排序的基礎(chǔ)上,在對(duì)索引上第二個(gè)字段進(jìn)行排序,其實(shí)就像是實(shí)現(xiàn)類似order by 字段1,字段2這樣的排序規(guī)則,那么第一個(gè)字段是絕對(duì)有序的,而第二個(gè)字段就是無序的了,因此一般情況下直接只用第二個(gè)字段判斷是用不到索引的,這就是為什么mysql要強(qiáng)調(diào)聯(lián)合索引最左匹配原則的原因。
優(yōu)化需謹(jǐn)慎,對(duì)于索引也不是越多越好,下面是關(guān)于索引過多的弊端:
- 數(shù)據(jù)量小的表不需要建立索引,建立會(huì)增加額外的索引開銷
- 數(shù)據(jù)變更需要維護(hù)索引,意味著更多的索引意味著更多的維護(hù)成本
- 更多的索引也需要跟多的存儲(chǔ)空間
小結(jié):
在平時(shí)項(xiàng)目中遇到慢sql,學(xué)會(huì)分析慢sql,對(duì)于特別耗時(shí)的需要通過建立合理的索引,遇到表結(jié)構(gòu)不合理的,合理結(jié)合項(xiàng)目進(jìn)行改造,約在前期注意這些問題,后期會(huì)在維護(hù)方面省不少事。