Hostmonster/优化MySQL

来自站长百科
跳转至: 导航、​ 搜索

优化你的MySQL[ ]

  • 了解一些做index(索引)的知识 允许你更有效地使用它们。首先,注意到当你使用索引更新表格时,索引也需要更新,这就有一个性能代价。除非你的系统运行的 inserts远多于selects,并且inserts 要很快速而selects不需要,这是一个值得的代价。
  • 如果你想选择多于一种标准会如何? (就像你所看到的,只对你在WHERE从句中使用的那些域作标记有效.)查询:
  • SELECT firstname FROM employee; 没有使用索引。 对firstname的索引无效.
  • 但是SELECT firstname FROM employee WHERE surname="Madida"; 将能从surname的索引获得好处。
  • 让我们看一写更复杂的例子,可以帮助我们提升查询。我们想要找到加班费率的一半低于20美元的员工。得知要做什么,你正确地给 overtime_rate做了标记, 看成where从句里的 column 。

ALTER TABLE employee ADD INDEX(overtime_rate);

运行查询[ ]

EXPLAIN SELECT firstname FROM employee WHERE overtime_rate/2<20; 
+----------+------+---------------+------+---------+------+------+------------+
| table    | type | possible_keys | key  | key_len | ref  | rows | Extra      |<br>
+----------+------+---------------+------+---------+------+------+------------+
| employee | ALL  | NULL          | NULL |    NULL | NULL |    2 | where used |<br>
+----------+------+---------------+------+---------+------+------+------------+
  • 每一份员工的单个记录都被读取,为什么这样? 问题出在查询的"overtime_rate/2" 部分. 每一个 overtime_rate (因此就是每一个记录)都必须被读取以被2分开。所以我们应该尝试不管编入索引的区域, 不需要进行任何计算。 这如何可能? 这就要用到学校里学的代数了! 你知道 'x/2 = y' 等价于 'x = y*2'.我们重写查询,看overtime_rate是否少于20*2,结果发生了什么.
EXPLAIN SELECT firstname FROM employee WHERE overtime_rate<20*2; <br>
+--------+-------+---------------+---------------+---------+------+------+----------+
|table   | type  | possible_keys | key           | key_len | ref  | rows |Extra     |<br>
+--------+-------+---------------+---------------+---------+------+------+----------+
|employee| range | overtime_rate | overtime_rate |       4 | NULL |    1 |where used|
+--------+-------+---------------+---------------+---------+------+------+----------+
  • MySQL 进行一次 20*2运算, 然后在索引里搜索该常量. 这里的法则是,保证索引区域与比较部分分离,这样 MySQL 可以用其来搜索,而不需要进行计算。.
  • 你可能会说我耍小聪明,应该这样表达请求:" overtime rate 低于40的部分",但是用户似乎有使用最坏的方式表达请求的习惯!

参考来源[ ]