1.使用索引来进行order by
(mark!!!看的笔记困惑,书上着墨不多,以后分析代码时细看!!)
只有当索引的顺序和order by子句的顺序完全一致,并且所有列的排序方向一样才可以。当联接查询时,orderby的必须是第一个表。
排序查询的where和order by需要形成索引的最左前缀,即总是要包含索引的左边的列。
例如对于表a(i int,j int ,k int,t int),在i,j,k上建索引
如下:
.....where i =.... order by j,k;
.....where i>....order by i,j;
如下则不能使用索引进行排序的查询
....where i=....order by j desc,k asc;
....where i=....order by j,t....引用不在索引中的列
....where i=....order by k.....不能形成最左前缀(隔着j)
....where i>....order by j,k...第一列上有范围条件
2.压缩索引
MyISAM使用前缀压缩来减小索引大小,默认情况下会压缩字符串,也可以压缩整数
可以使用create table时用PACK_KEYS控制索引压缩的方式。
PACK_KEYS在MySQL手册中如下描述:
如果您希望索引更小,则把此选项设置为1。这样做通常使更新速度变慢,同时阅读速度加快。把选项设置为0可以取消所有的关键字压缩。把此选项设置为DEFAULT时,存储引擎只压缩长的CHAR或VARCHAR列(仅限于MyISAM)。
如果您不使用PACK_KEYS,则默认操作是只压缩字符串,但不压缩数字。如果您使用PACK_KEYS=1,则对数字也进行压缩。
在对二进制数字关键字进行压缩时,MySQL采用前缀压缩:
o 每个关键字需要一个额外的字节来指示前一个关键字中有多少字节与下一个关键字相同。
o 指向行的指针以高位字节优先的顺序存储在关键字的后面,用于改进压缩效果。
这意味着,如果两个连续行中有许多相同的关键字,则后续的“相同”的关键字通常只占用两个字节(包括指向行的指针)。与此相比,常规情况下,后续的关键字占用storage_size_for_key + pointer_size(指针尺寸通常为4)。但是,只有在许多数字相同的情况下,前缀压缩才有好处。如果所有的关键字完全不同,并且关键字不能含有NULL值,则每个关键字要多使用一个字节。(在这种情况中,储存压缩后的关键字的长度的字节与用于标记关键字是否为NULL的字节是同一字节。