快速定位不合理的索引——MySQL索引調優
原文連結:http://http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=401131835&idx=1&sn=37c5fd9d3d8670fb379a1e0565e50eeb&scene=0#wechat_redirect
建立索引是門技術活,開發DBA的工作之一就是配合應用建立最優的索引。然大部分公司並沒有開發DBA一職,大多數的索引建立需要由程式開發人員自己完成,這導致的一個後果是,索引建立的好與壞大部分情況下需要看這個程式猿的氣質。
通常,Inside君透過下面這條SQL語句來檢視建立的索引(同時喝著咖啡,聽著音樂),大部分情況下可以定位出90%的索引建立不合理情況:
SELECT
t.TABLE_SCHEMA,t.TABLE_NAME,INDEX_NAME, CARDINALITY,TABLE_ROWS, CARDINALITY/TABLE_ROWS AS SELECTIVITY
FROM
information_schema.TABLES t,
(
SELECT table_schema,table_name,index_name,cardinality
FROM information_schema.STATISTICS
WHERE (table_schema,table_name,index_name,seq_in_index) IN (
SELECT table_schema,table_name,index_name,MAX(seq_in_index)
FROM information_schema.STATISTICS
GROUP BY table_schema , table_name , index_name )
) s
WHERE
t.table_schema = s.table_schemaAND t.table_name = s.table_name AND t.table_rows != 0
AND t.table_schema NOT IN ( 'mysql','performance_schema','information_schema')
ORDER BY SELECTIVITY;
上述的SQL語句利用了information_schema資料庫下的後設資料表TABLES、STATISTICS。表TABLES記錄了表的基本資訊,例如庫名,表名,行數等。表STATISTICS記錄了各個索引的CARDINALITY值。那麼CARDINALITY / TABLE_ROWS表示的就是索引的選擇性。在Inside君的《MySQL技術內幕:InnoDB儲存引擎》一書中明確指出的是,在OLTP的應用場景下,建立的索引是要求高選擇性的。若CARDINALITY / TABLE_ROWS小於10%(經驗值),那麼表示資料重複率較高,通常需要考慮是否有必要建立該索引。該語句執行的結果如下所示,列SELECTIVITY表示的就是選擇性:
可惜的是上述SQL語句並不能工作在MySQL 5.6版本下(即使最新的MySQL 5.6.28版本),因為目前5.6的STATISTICS表中關於Cardinality的統計是錯誤的!!!具體可見MySQL bugs #78066。但是,表innodb_index_stats中關於Cardinality值得統計依然是正確的,那麼問題來了:
-
有誰知道5.6下上述SQL該如何改寫?
5.6的SQL見 http://blog.itpub.net/27000195/viewspace-2036615/ -
如何修復5.6下的Cardinality Bug?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27000195/viewspace-2036643/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.6快速定位不合理索引MySql索引
- MySQL調優之索引優化MySql索引優化
- MySQL索引和SQL調優MySql索引
- MySQL 索引和 SQL 調優總結MySql索引
- 效能調優-Mysql索引資料結構詳解與索引優化MySql索引資料結構優化
- Mysql索引優化之索引的分類MySql索引優化
- MySQL索引優化MySql索引優化
- mysql優化索引MySql優化索引
- MySQL調優篇 | 索引知識解讀(2)MySql索引
- MySQL索引的優缺點MySql索引
- 淺談MySQL的B樹索引與索引優化MySql索引優化
- MySQL 調優之如何正確使用聯合索引MySql索引
- Mysql索引優化(一)MySql索引優化
- MySQL 5.7 索引優化MySql索引優化
- 【索引】使用索引分析快速得到索引的基本資訊索引
- mysql索引的使用和優化MySql索引優化
- MySQL的索引優化分析(一)MySql索引優化
- MySQL的索引優化分析(二)MySql索引優化
- MySQL 字串索引優化方案MySql字串索引優化
- MySQL 索引原理以及優化MySql索引優化
- mysql索引原理及優化MySql索引優化
- MySQL——索引優化實戰MySql索引優化
- MySQL 筆記 - 索引優化MySql筆記索引優化
- MySQL優化之索引解析MySql優化索引
- 2 mysql索引優化分析MySql索引優化
- mysql 語句的索引和優化MySql索引優化
- MySQL 效能優化之索引優化MySql優化索引
- MySQL(二):快速理解MySQL資料庫索引MySql資料庫索引
- 理解索引:索引優化索引優化
- mysql索引之字首索引MySql索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- MySQL的索引MySql索引
- 又一個複合索引的SQL調優索引SQL
- MySQL函式索引及優化MySql函式索引優化
- MySQL 索引使用策略及優化MySql索引優化
- MySQL索引與查詢優化MySql索引優化
- mysql優化篇(基於索引)MySql優化索引
- 理解 MySQL(2):索引與優化MySql索引優化