MySQL 查询语句优化
避免使用 SELECT *
SELECT * 会导致数据库扫描整张表,如果表中有很多字段,就会增加查询的复杂度和资源消耗,那么就会导致查询效率低下。
优化前
1
SELECT * FROM `user` WHERE `age` > 25;优化后
1
SELECT `id`, `name`, `age` FROM `user` WHERE `age` > 25;避免在 WHERE 子句中使用函数
在 WHERE 子句中使用函数可能会导致 MySQL 中无法使用索引,从而降低查询性能。
优化前
1
SELECT * FROM `user` WHERE YEAR(`created_at`) = 2021;优化后
1
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 以提高查询性能。
优化前
1
SELECT * FROM `user` LEFT JOIN `user_info` ON `user`.`id` = `user_info`.`user_id`;优化后
1
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 子句则可以更好地处理这种情况,他们只需检查是否存在匹配的行,而不是返回所有匹配的行。
优化前
1
SELECT * FROM `user` WHERE `id` IN (SELECT `user_id` FROM `user_info`);优化后
1
SELECT * FROM `user` WHERE EXISTS (SELECT 1 FROM `user_info` WHERE `user`.`id` = `user_info`.`user_id`);如果数据量少,可以使用 IN 子句,如果数据量大,应该使用 EXISTS 子句。
避免在 WHERE 子句中使用 OR 运算符
OR 运算符在 WHERE 子句中使用时,可能会导致 MySQL 无法使用索引,从而降低查询性能。
优化前
1
SELECT * FROM `user` WHERE `age` = 25 OR `age` = 26;优化后
1
SELECT * FROM `user` WHERE `age` IN (25, 26);在上面例子中,使用 IN 子句可以避免 OR 运算符并使用索引,从而提高查询性能。