HostMonster:优化MySQL

出自美国主机知识库

跳转到: 导航, 搜索

我持续接到CPU超载错误,如何解决?

优化你的MySQL:

参考文献: Queries and Indexes Article 2 of 4 Courtesy of:Ian Gilfillan 地址:http://www.databasejournal.com/features/mysql/article.php/10897_1382791_2


了解一些做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 |
+----------+------+---------------+------+---------+------+------+------------+
| employee | ALL | NULL | NULL | NULL | NULL | 2 | where used |
+----------+------+---------------+------+---------+------+------+------------+
一点都不好!每一份员工的单个记录都被读取,为什么这样? 问题出在查询的"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;
+--------+-------+---------------+---------------+---------+------+------+----------+
|table | type | possible_keys | key | key_len | ref | rows |Extra |
+--------+-------+---------------+---------------+---------+------+------+----------+
|employee| range | overtime_rate | overtime_rate | 4 | NULL | 1 |where used|
+--------+-------+---------------+---------------+---------+------+------+----------+
好多了! MySQL 进行一次 20*2运算, 然后在索引里搜索该常量. 这里的法则是,保证索引区域与比较部分分离,这样 MySQL 可以用其来搜索,而不需要进行计算。. 你可能会说我耍小聪明,应该这样表达请求:" overtime rate 低于40的部分",但是用户似乎有使用最坏的方式表达请求的习惯!

个人工具
名字空间
变换
动作
导航
工具/资源
工具箱