技术开发 频道

MySQL优化总结

  这里的一个问题是MySQL能更高效地在声明具有相同类型和尺寸的列上使用索引。在本文中,VARCHAR和CHAR是相同的,除非它们声明为不同的长度。因为tt.ActualPC被声明为CHAR(10)并且et.EMPLOYID被声明为CHAR(15),长度不匹配。

  为了修正在列长度上的不同,使用ALTER TABLE将ActualPC的长度从10个字符变为15个字符:

  mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

  现在tt.ActualPC和et.EMPLOYID都是VARCHAR(15),再执行EXPLAIN语句产生这个结果:

  table type possible_keys key key_len ref rows Extra

  tt ALL AssignedPC, NULL NULL NULL 3872 Using

  ClientID, where

  ActualPC

  do ALL PRIMARY NULL NULL NULL 2135

  range checked for each record (key map: 1)

  et_1 ALL PRIMARY NULL NULL NULL 74

  range checked for each record (key map: 1)

  et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1

  这不是完美的,但是好一些了:rows值的乘积少了一个因子74。这个版本在几秒内执行完。

  第2种方法能消除tt.AssignedPC = et_1.EMPLOYID和tt.ClientID = do.CUSTNMBR比较的列的长度失配问题:

  mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),

  -> MODIFY ClientID VARCHAR(15);

  EXPLAIN产生的输出显示在下面:

  table type possible_keys key key_len ref rows Extra

  et ALL PRIMARY NULL NULL NULL 74

  tt ref AssignedPC, ActualPC 15 et.EMPLOYID 52 Using

  ClientID, where

  ActualPC

  et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1

  do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1

  这几乎很好了。

1
相关文章