high performence mysql读书笔记

high performence mysql读书笔记
----------------------------
P165
choosing a good column order
我们已经看到的疑惑的一个最常见的原因是索引中字段的顺序。正确的顺序取决于将会使用这个索引的查询,并且你必须考虑怎样选择索引的顺序,以使数据行以一种有助于查询的方式被排序和分组。(这节适用于B-tree索引。顺便的提一下,hash索引和其他的索引并不像B-tree索引那样以有序的方式存储数据。)

多字段B-tree索引中的字段顺序意味着索引首先会按最左边的字段排序,接着是按下一个字段,以此类推。因此,索引可以按正向或反向的顺序被扫描,以满足那些带有order by、group by和distinct等与字段顺序准确匹配的表达式的查询。

因此,字段的顺序在多列索引中是极其重要的。字段顺序要么有助于要么阻止索引获得Lahdenmaki和Leach的三星级系统中"星级"。通过本章余下的章节,我们会展示许多它将如何工作的例子。

有一个被接受的选择字段顺序的古老的准则:把经常用来选择的那些字段放到索引的开头。这条建议有多有用?它在一些场合是有帮助的,但是全面来看,它通常远没有避免随机I/O和排序重要。(具体情况不同,所以并没有一个通用的准则。这仅能告诉你这条被接受的准则可能没有你想的那样重要。)

将最具有选择性的字段放在开头,在不考虑分组或排序的时候可能是个好主意,这样,索引的目的只是用来优化where查找。在这样的情况下,这样设计索引以便尽快的过滤数据行可能确实工作的很好,所以这样做对于在where子句中仅仅指定一个索引前缀的查询更有选择性。然而,这不仅仅取决于所有候选字段的选择性,而且取决于你用来查询的值。这与我们选择一个好的前缀长度时的考虑是一个类型.你可能真的需要选择字段的顺序,以便使经常运行的查询具有尽可能的选择性。

让我们用以下的查询举例说明:
select * from payment where staff_id=2 and customer_id=584
我们应该在(staff_id,customer_id)上创建索引,还是采用相反的顺序?我们可以运行一些快速的查询来帮助检查table里值的分布,然后决定哪些column具有更高的selectivity.让我们把这个查询转成计算where子句里每个谓词的基数:
select  sum(staff_id=2),sum(customer_id=584) from paymment\G
-----------------------------
sum(staff_id=2):7992
sum(customer_id=584):30
根据经验,我们应该把customer_id放在索引的第一位,因为这个谓词能匹配到表中更少的数据行。接着我们能再次执行查询,来看看






你可能感兴趣的:(mysql)