我是在生产MySQL中运行的应用程序的新维护者。以前的维护者已经离开了很少的文档,并且不可联系。
我面临的问题是以下请求大约需要10秒才能执行:
SELECT COUNT(*) FROM `users` WHERE (`active` = TRUE AND `deleted_at` IS NULL);
users表中有大约170,000条记录,没有索引。
此请求的EXPLAIN命令:
mysql> EXPLAIN SELECT COUNT(*) FROM `users` WHERE (`active` = TRUE AND `deleted_at` IS NULL);
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 145407 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
现任网站所有者(非技术人员)告诉我,2周前表演突然下降。因此,在尝试添加索引之前,我已将生产数据库转储到我的本地MySQL服务器中。同样的请求在本地只需4秒。
我对这种差异感到非常惊讶,我想知道操作系统或MySQL服务器上的某些问题是否可能解释它?是否值得以这种方式进行调查?如果是这样的话?如果没有,对于没有索引的这种查询,这种性能是否“正常”(我对SQL性能的经验有限)?
在服务器上:
$ mysql -u root --version
mysql Ver 14.14 Distrib 5.1.44, for unknown-linux-gnu (x86_64) using readline 5.1
$ cat /etc/redhat-release
CentOS release 5.4 (Final)
本地机器:
$ $ mysql -u root --version
mysql Ver 14.14 Distrib 5.1.42, for apple-darwin10.2.0 (i386) using EditLine wrapper
谢谢!
Traroth的编辑:
答案 0 :(得分:0)
可能的差异:
答案 1 :(得分:0)
您可以尝试在列active, and deleted_at
我认为delete_at is null
只是......
您可能希望将其转换为smallint
,默认为0(表示为空)
如果您进行批量删除,optimize table your_table;
会压缩数据以获得更好的效果。
答案 2 :(得分:0)
这些机器在许多方面都有所不同(CPU数量,CPU速度,RAM数量,RAM速度,磁盘速度(访问时间和吞吐量),磁盘分配,当然还有系统负载。所以你不应该期望性能是相同。