)的时候才可以。如果多个表进行Join的话,那么只有第一个表的列在order by中出现,并且需要order by满足最左匹配。其他的情况MySQL都是使用filesort.
压缩(前缀压缩)索引
MyISAM使用前缀压缩来减小index的大小,这样可以让更多的索引放到内存中,在某些情况能很大的优化性能。MyISAM压缩字符类型的值,你也可以告诉它压缩整数的值。
MyISAM将每一个索引块进行压缩,它完全的存储索引块的第一个值,然后通过记录和前面值的最长公共前缀的大小,加上不同的后缀值的方式来存储其他的值。比如第一个是perform,第二个是performance,那么第二个值将被存储为7,ance。MySQL同事对相邻行的指针进行前缀压缩的方式存储。
压缩的块使用较少的空间,但是让某些操作变慢。因为每一个前缀压缩的值都依赖于前面的值,所以MyISAM不能使用二分查找来找到索引块中的值,必须通过从开始顺序扫描的方式。
顺序的向前扫描很高效,但是相反的扫描方向,比如order by desc,不能很好的工作。
任何在块中央的值都需要顺序扫描,平均需要扫描半个块。我们做性能测试发现,压缩的索引要慢好几倍,因为扫描需要随机查找,逆向的扫描会更糟。这是cpu和I/O操作的一个权衡,压缩的索引可能会在磁盘空间上是原来的1/10左右。
你可以通过在创建表的时候使用PACK_KEYS选项来控制一个table的索引被压缩。
多余和重复的索引
MySQL允许对一个列建多次索引,MySQL需要独立的维护这些重复的索引,query的优化也要考虑他们每一个。这会导致严重的性能问题。
你可能不经意间创建重复的索引,比如:
Sql代码
CREATE TABLE test (
ID INT NOT NULL PRIMARY KEY,
UNIQUE(ID),
INDEX(ID)
);
MySQL会对UNIQUE和PRIMARY KEY约束的列自动建索引,所以会导致重复对一个列ID创建三个索引。
多余的索引和重复索引有点不同。如果你对(A,B)建立了联合索引,另外对A建立了索引,那么索引A是重复的,因为他是第一个索引的前缀。
索引和锁
索引在InnoDB中起到了重要的作用,因为它让查询锁住更少的行,这是一个重要的考虑,因为MySQL 5.0的InnoDB知道事务结束才解锁行。
如果查询不触及不需要的行,那么就会锁住更少的行,这样会得到更好的性能:
1.虽然InnoDB的所非常高效、使用比较少的内存,但是仍然可能导致一些行过早的锁住。
2.锁住更多的行增加了锁的竞争,减少并发性。
尽可能的去扩展索引,而不是添加一个新的索引,因为通常维护多列的索引要比几个单列的索引要搞笑,如果你不知道你query的分布,那么尽量在有区分度的列建索引。
支持多种过滤条件
在有区分度的列建索引通常会更高效,