mysql联合索引数据库查询数据会变慢_如何定位并优化慢查询SQL以及联合索引和索引多的弊端...
以下思路均以Mysql為例,不過SQL調優通用的
根據慢日志定位慢查詢SQL;
使用show variables like ‘%quer%’;主要查看slow_query_log,slow_query_log_file,long_query_time;這三個是主要關注和修改的變量。
show status like ‘%slow_queries%’; ——查詢慢查詢的數量。
set global slow_query_log = on; ——設置打開慢查詢日志;set global long_query_time = 1; ——設置大于1s的查詢都屬于慢查詢;( 這個需要重連數據庫才能更新的);并且以上修改在重啟數據庫之后會重置成原來的設置,如果需要永久修改的話就需要到my.cmf(linux)或my.ini(windows)的配置文件到修改好對應的值。
使用explain等工具分析SQL;
在SQL語句前使用explain執行分析語句,優先觀察三個字段:id,type,extra;(其他字段的作用請網上查詢);其中id越大,代表越先執行,type為all則代表全表掃描,extra為using filesort或using temporary 都是可選優化的。
修改SQL或者盡量讓SQL走索引。
創建聯合索引
建表時:
CREATE TABLE test (
‘a’ INT(11) NOT NULL DEFAULT ‘’,
‘b’ INT(11) NOT NULL DEFAULT ‘’,
‘c’ INT(11) NOT NULL DEFAULT ‘’,
‘d’ INT (11) UNSIGNED NOT NULL DEFAULT 0,
KEY sindex (a, b, c,‘d’)
) ENGINE = MyISAM COMMENT = ‘’;
建表后:
alert table test add INDEX sindex (a,b,c,‘d’) ;
最左匹配原則:
mysql會一直向右匹配直到遇到范圍查詢(>、5 and d=6 ,如果像上面一樣建立(a,b,c,d)聯合索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整;
=和in可以亂序,比如a = 1 and b = 2 and c = 3建立(a,b,c)索引可以任意順序,mysql的查詢優化優化器會幫你優化成索引可以識別的形式;
成因:
mysql創建復合索引的規則是首先會對復合索引的最左邊,也就是索引中的第一個字段進行排序,在第一個字段排序的基礎上,在對索引上第二個字段進行排序,其實就像是實現類似order by 字段1,字段2這樣的排序規則,那么第一個字段是絕對有序的,而第二個字段就是無序的了,因此一般情況下直接只用第二個字段判斷是用不到索引的,這就是為什么mysql要強調聯合索引最左匹配原則的原因。
索引是越多越好么
答案是否定的
數據量小的表不需要建立索引,建立會增加額外的索引開銷
數據變更需要維護索引,意味著更多的索引意味著更多的維護成本
更多的索引也需要跟多的存儲空間
總結
以上是生活随笔為你收集整理的mysql联合索引数据库查询数据会变慢_如何定位并优化慢查询SQL以及联合索引和索引多的弊端...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿波罗配置中心(apollo)的个人看法
- 下一篇: 秒杀业务的基础点