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的部分",但是用户似乎有使用最坏的方式表达请求的习惯!