MYSQL优化

伪哈希技巧

使用一个函数 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

image

在实际的开发中是要避免产生filesort文件排序,怎么优化?

建立联合索引

使用Innodb引擎

  • 先取出数据,形成临时表,做filesort文件排序(排序时文件可能在磁盘中,也有可能在内存中)。

重复索引与冗余索引

重复索引:在同一开裂或者顺序相同的几个列建立多个索引。eg:index c1(id ,name .email), index c2(id ,name)

冗余索引:多个所以所覆盖的列有重叠,二顺序不同。eg:index c1tag1,tag2)  ,index c2(tag2,tag1)

重复索引并不会提高查询的效率,这是没有必要的。而冗余索引是可以提高查询的效率,在一定的情况是可提倡。由此可见 索引的顺序是有必要注意得。

碎片与维护

在长期的数据更改过程中,索引文件和数据文件都会产生空洞的碎片,因此数据间的间隙增大,所以查询的速度就减慢,那么对表进行修复操作是必要得,修复的周期害的看数据的更新频率。

image

可知Innodb是不支持 optimize 这个命令,这个命令仅支持Myisam(optimize table table_name)。 但也可用  alter  table table_name engine =’innodb’,这个命令进行数据的集中优化。

原文地址:https://www.cnblogs.com/webph/p/6552807.html