2015年9月22日 星期二

修復MySQL的基數(Cardinality)

看到了這句SQL:
SELECT DISTINCT(`issue`) FROM `table_name` FORCE INDEX (`idx_issue`) 
WHERE `issue` <= '2015014'
FORCE INDEX => 強制索引
代表該語句只使用索引名稱為idx_issue 的索引,延伸的用法有 IGNORE INDEX

什麼是基數( Cardinality )
基數是數據列所包含的不同值的數量。例如,某個數據列包含值1、3、7、4、7、3,那麼它的基數就是4。索引的基數相對於數據表行數較高(也就是說,列中包含很多不同的值,重複的值很少)的時候,它的工作效果最好。如果某數據列含有很多不同的年齡,索引會很快地分辨數據行。如果某個數據列用於記錄性別(只有"M"和"F"兩種值),那麼索引的用處就不大。如果值出現的幾率幾乎相等,那麼無論搜索哪個值都可能得到一半的數據行。在這些情況下,最好根本不要使用索引,因為查詢優化器發現某個值出現在表的數據行中的百分比很高的時候,它一般會忽略索引,進行全表掃描。慣用的百分比界線是"30%"。

查詢基數
mysql> show index from table_name

查詢到的基數與表中資料不符
修復指令
mysql> ANALYZE TABLE table_name

參考資料:
http://bbs.csdn.net/topics/80230813 请问MYSQL数据库中建立索引,索引的基数是什么意思?
https://et3w503.wordpress.com/2008/12/02/%E9%80%9A%E9%81%8Eforce-index%E4%BA%86%E8%A7%A3%E7%9A%84mysql%E6%9F%A5%E8%A9%A2%E7%9A%84%E6%80%A7%E8%83%BD%E5%84%AA%E5%8C%96/  通過force index了解的MySQL查詢的性能優化
http://blog.csdn.net/alongken2005/article/details/6394016  mysql优化Analyze Table


沒有留言:

張貼留言