MySQL: Index Selectivity

一个索引的Selectivity是:

select count(distinct 姓)/count(*) from ...  


索引字段上所有值的相异程度。相异程度越高(中国人每人1个姓),意味着一个普通lookup查询返回的值越少(姓陈的只有1个), 性能越好; 相异程度越低(中国人只允许100个姓),则相反(姓陈记录数=有13亿/100 =130万) ,性能不会好。

知道这个又有什么用呢? 举例来说,一个文本字段越长,Selectivity一般就越高,但同时在它上面建索引的代价也越高。 避免给长文本建索引的方法之一是给它的前缀(或其他截取子串的方式)建立索引。

问题是,前缀的长度定多少合适? 这个就取决于前缀的Selectivity了。很短的前缀,比如只取第1个字母,那建索引肯定很快,但Selectivty也会很低,查询性能会很弱。 前缀长度要做到:Selectivity可以接受,同时长度仍然适于直接索引。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.