高性能的索引策略

 

Isolating the Column

孤立列就是说,这一列不能在表达示中或在一个函数里面,如

mysql> SELECT actor_id FROM actor WHERE actor_id + 1 = 5; 错误

再如:

mysql> SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;

 

Prefix Indexes and Index Selectivity

当你索引一个非常长的字符串时,你的索引会变大变慢,这时你可以只索引字符串前面几个字符,但这会导致你的索引的“选择性”降低。

索引选择性(Index Selectivity)是唯一索引数/总行数(#T),大小从1/#T到1.

如果你索引的列是BLOB、TEXT或是很长的VARCHAR,那么MySQL会强制你使用前缀索引。

问题在于:如何找到最合适的前缀长度。

 

假设有一张城市的表,你要对城市名称做索引

那么

mysql> SELECT COUNT(*) as cnt, city

-> FROM city_demo GROUP BY city ORDER BY cnt DESC LIMIT 10;

得到这样的结果。

现在我们试着找出前缀的出现频率

mysql> SELECT COUNT(*) cnt, LEFT(city, 3) AS pref

-> FROM city_demo GROUP BY pref ORDER BY cnt LIMIT 10;

每个前缀出的出镜率都很高,这时我们加长前缀的长度

mysql> SELECT COUNT(*) AS cnt, LEFT(city, 7) AS pref
-> FROM sakila.city_demo GROUP BY pref ORDER BY cnt DESC LIMIT 10;

这时前缀索引的频率已经和完全索引差不多,我们认为这是个不错的长度。

前缀索引的缺点:无法在ORDER BY 和 GROUP BY查询中被使用,也不能把它们做为covering indexes来使用。