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.默認慢查詢的時間為10s,改變慢查詢時間定義: 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語句中進行,也可以單獨用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ù)庫維護操作中經(jīng)常使用抢腐。在數(shù)據(jù)庫運行了較長時間后,索引都有損壞的可能襟交,這時就需要重建迈倍。對數(shù)據(jù)重建索引可以起到提高檢索效率。
mysql> REPAIR TABLE `table_name` QUICK;
3)查詢數(shù)據(jù)庫索引
mysql> SHOW INDEX FROM `table_name`;
4)刪除索引
刪除索引可以使用ALTER TABLE或DROP INDEX語句來實現(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索引中使用,因為一個表只可能有一個PRIMARY KEY索引丘侠,因此也可不指定索引名徒欣。如果沒有創(chuàng)建PRIMARY KEY索引,但表具有一個或多個UNIQUE索引蜗字,則MySQL將刪除第一個UNIQUE索引打肝。如果從表中刪除某列脂新,則索引會受影響。對于多列組合的索引粗梭,如果刪除其中的某列争便,則該列也會從索引中刪除。如果刪除組成索引的所有列断医,則整個索引將被刪除滞乙。
5)強制使用索引
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)合索引的最左匹配原則:
對于聯(lián)合索引當條件為 a=1 and b=1 則使用索引 ,當a=1 時也使用索引 當單獨使用b=1時則不使用索引鉴嗤。
MySql會一直向右匹配直到遇到范圍查詢(>斩启、<、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)化器會幫你優(yōu)化成索引可以識別的形式坯认。
6.3)聯(lián)合索引的最左匹配原則的成因
mysql創(chuàng)建復合索引的規(guī)則是首先會對復合索引的最左邊翻擒,也就是索引中的第一個字段進行排序,在第一個字段排序的基礎上牛哺,在對索引上第二個字段進行排序韭寸,其實就像是實現(xiàn)類似order by 字段1,字段2這樣的排序規(guī)則荆隘,那么第一個字段是絕對有序的,而第二個字段就是無序的了赴背,因此一般情況下直接只用第二個字段判斷是用不到索引的椰拒,這就是為什么mysql要強調(diào)聯(lián)合索引最左匹配原則的原因。
優(yōu)化需謹慎凰荚,對于索引也不是越多越好燃观,下面是關于索引過多的弊端:
- 數(shù)據(jù)量小的表不需要建立索引,建立會增加額外的索引開銷
- 數(shù)據(jù)變更需要維護索引便瑟,意味著更多的索引意味著更多的維護成本
- 更多的索引也需要跟多的存儲空間
小結(jié):
在平時項目中遇到慢sql缆毁,學會分析慢sql,對于特別耗時的需要通過建立合理的索引到涂,遇到表結(jié)構(gòu)不合理的脊框,合理結(jié)合項目進行改造颁督,約在前期注意這些問題,后期會在維護方面省不少事浇雹。