MySQL 查询慢是很常见的问题。在优化查询之前,我们需要找出查询的问题在哪里。
对于一个查询,我们可以使用 EXPLAIN 命令来查看查询的执行计划。EXPLAIN 输出的结果会显示 MySQL 执行查询时的各种信息,如扫描的行数、索引的使用情况等。我们可以根据这些信息来判断查询是否存在问题,以及优化的方向。
mysql>EXPLAIN SELECT * FROM users WHERE age >18;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 768 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
上面的查询会扫描整个 users 表,即使我们在 age 字段上创建了索引也不会用到。这是因为我们使用了 SELECT *,也就是查询所有字段。如果我们只查询需要的字段,如下所示:
mysql>EXPLAIN SELECT id, name FROM users WHERE age >18;
+----+-------------+-------+------+----------------------+-------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+----------------------+-------------+---------+-------+------+-------------+
| 1 | SIMPLE | users | ref | idx_age | idx_age | 4 | const | 384 | Using index |
+----+-------------+-------+------+----------------------+-------------+---------+-------+------+-------------+
现在查询使用了 idx_age 索引,效率明显提高了。
另外,查询的 WHERE 条件中使用的函数也会导致查询变慢。如使用了日期函数,可以尝试将日期转换成 UNIX 时间戳,以便加速查询。
除此之外,可以考虑使用缓存和优化服务器硬件等方法来提高查询效率。