伪哈希技巧
使用一个函数 crc32($string),能把一个字符串转化为32位整数。
$checksum = crc32("The quick brown fox jumped over the lazy dog."); printf("%u ", $checksum); //2191738434
把整形数据保存到数据中肯定比直接保存字符串要快得多。
多列索引时要考虑因数
查询频率
列区分度
列查询顺序
索引与排序关系
排序可能发生的两种情况
- 对索引覆盖,直接在索引查询时就是有序得。在Innodb引擎中,沿着引擎字段排序,自然是有序得。对于Myisam引擎,如果按索引字段排序,如ID,但取出来字段中,有未索引字段,如dede_name,Myisam做法并不是先在索引树上找,在回行,而是先取出所有的行再进行排序。
先建两张表仅是引擎不同
create table test_index( id int primary key auto_increment, name char(10) not null default ``, email char(10) not null default ``, index c (`id`,`name`) ) engine = Innodb charset utf8; create table test_order( id int primary key auto_increment, name char(10) not null default '', email char(10) not null default '', index c (`id`,`name`) ) engine = myisam charset utf8;
explain select id , email from test_index order by idG
explain select * from test_order order by idG
在实际的开发中是要避免产生filesort文件排序,怎么优化?
建立联合索引
使用Innodb引擎
- 先取出数据,形成临时表,做filesort文件排序(排序时文件可能在磁盘中,也有可能在内存中)。
重复索引与冗余索引
重复索引:在同一开裂或者顺序相同的几个列建立多个索引。eg:index c1(id ,name .email), index c2(id ,name)
冗余索引:多个所以所覆盖的列有重叠,二顺序不同。eg:index c1tag1,tag2) ,index c2(tag2,tag1)
重复索引并不会提高查询的效率,这是没有必要的。而冗余索引是可以提高查询的效率,在一定的情况是可提倡。由此可见 索引的顺序是有必要注意得。
碎片与维护
在长期的数据更改过程中,索引文件和数据文件都会产生空洞的碎片,因此数据间的间隙增大,所以查询的速度就减慢,那么对表进行修复操作是必要得,修复的周期害的看数据的更新频率。
可知Innodb是不支持 optimize 这个命令,这个命令仅支持Myisam(optimize table table_name)。 但也可用 alter table table_name engine =’innodb’,这个命令进行数据的集中优化。