MySQL 查询语句优化
避免使用 SELECT *
SELECT *
会导致数据库扫描整张表,如果表中有很多字段,就会增加查询的复杂度和资源消耗,那么就会导致查询效率低下。
优化前
SELECT * FROM `user` WHERE `age` > 25;
优化后
SELECT `id`, `name`, `age` FROM `user` WHERE `age` > 25;
避免在 WHERE
子句中使用函数
在 WHERE
子句中使用函数可能会导致 MySQL 中无法使用索引,从而降低查询性能。
优化前
SELECT * FROM `user` WHERE YEAR(`created_at`) = 2021;
优化后
SELECT * FROM `user` WHERE `created_at` BETWEEN '2021-01-01' AND '2021-12-31';
这个例子中,使用 YEAR
函数将使 MySQL 无法使用 created_at
字段上的索引,而使用 BETWEEN
则可以使用索引并且提高查询性能。
使用 JOIN
时,使用 INNER JOIN
而不是 LEFT JOIN
或者 RIGHT JOIN
,除非你确实需要。
INNER JOIN
通常比 LEFT JOIN
和 RIGHT JOIN
更快,因为它只返回匹配的行,如果不需要返回非匹配的行,应该使用 INNER JOIN
以提高查询性能。
优化前
SELECT * FROM `user` LEFT JOIN `user_info` ON `user`.`id` = `user_info`.`user_id`;
优化后
SELECT * FROM `user` INNER JOIN `user_info` ON `user`.`id` = `user_info`.`user_id`;
使用 EXISTS
或 NOT EXISTS
代替 IN
或 NOT IN
IN
和 NOT IN
子句可能效率较低,尤其是在子查询中包含大量记录时,而 EXISTS
和 NOT EXISTS
子句则可以更好地处理这种情况,他们只需检查是否存在匹配的行,而不是返回所有匹配的行。
优化前
SELECT * FROM `user` WHERE `id` IN (SELECT `user_id` FROM `user_info`);
优化后
SELECT * FROM `user` WHERE EXISTS (SELECT 1 FROM `user_info` WHERE `user`.`id` = `user_info`.`user_id`);
如果数据量少,可以使用 IN
子句,如果数据量大,应该使用 EXISTS
子句。
避免在 WHERE
子句中使用 OR
运算符
OR
运算符在 WHERE
子句中使用时,可能会导致 MySQL 无法使用索引,从而降低查询性能。
优化前
SELECT * FROM `user` WHERE `age` = 25 OR `age` = 26;
优化后
SELECT * FROM `user` WHERE `age` IN (25, 26);
在上面例子中,使用 IN
子句可以避免 OR
运算符并使用索引,从而提高查询性能。