WEB开发网
开发学院数据库MySQL Schema的优化和索引 - 高性能的索引策略 - 前缀索... 阅读

Schema的优化和索引 - 高性能的索引策略 - 前缀索引和索引的选择性

 2009-09-02 00:00:00 来源:WEB开发网   
核心提示:有的时候你可能需要索引字符数非常多的列,这会让你的索引非常大并且很慢,Schema的优化和索引 - 高性能的索引策略 - 前缀索引和索引的选择性,一个策略就是模拟hash索引,前一部分已经说过了,并且我们使用了RAND(),因此结果是变化的,但是有的时候这种方法也不是很好,将要怎么做

有的时候你可能需要索引字符数非常多的列。这会让你的索引非常大并且很慢。一个策略就是模拟hash索引。前一部分已经说过了。但是有的时候这种方法也不是很好。将要怎么做。

一般可以用索引前一部分的一些字符的方法来节省空间并且可以获得好的性能。这样可以使你的索引使用更少的空间,但是这样会降低选择性。索引的选择性(Index selectivity)是索引值的数量和表中行的数量(#T)的一个比率。范围是1/#T到1.索引的选择性越高越好,因为这样当匹配的时候,MySQL就会过滤掉更多的行。一个唯一索引的选择性1,这是最好的了。

一个前缀的索引对于好的性能来说,它的选择性已经足够了。如果你对BLOB和TEXT列进行索引,或者非常长的VARCHAR列,你必须定义前缀索引,因为MySQL不允许索引它们的全部长度。

技巧就是选择一个列的前缀,并且这个前缀的长度能有个好的选择性,但是又可能节约更多的空间。索引前缀所带来的索引效果应该尽可能的接近索引全部长度所带来的效果。

要知道一个好的前缀的长度,找到最常见的值并且把它们和最常见的前缀进行比较。看下如下例子

CREATE TABLE sakila.city_demo(city VARCHAR(50) NOT NULL);
INSERT INTO sakila.city_demo(city) SELECT city FROM sakila.city;
-- Repeat the next statement five times:
INSERT INTO sakila.city_demo(city) SELECT city FROM sakila.city_demo;
-- Now randomize the distribution (inefficiently but conveniently):
UPDATE sakila.city_demo
   SET city = (SELECT city FROM  sakila.city ORDER BY RAND( ) LIMIT 1);

现在我们有一个示例数据集。结果并不是真是分布的,并且我们使用了RAND(),因此结果是变化的,但是对于此练习并不会有什么影响。首先我们找到出现频率最高的cities.

1 2 3  下一页

Tags:Schema 优化 索引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接