别调P
文章14
标签39
分类14

文章分类

文章归档

MySQL 查询语句优化

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 JOINRIGHT 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`;

使用 EXISTSNOT EXISTS 代替 INNOT IN

INNOT IN 子句可能效率较低,尤其是在子查询中包含大量记录时,而 EXISTSNOT 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 运算符并使用索引,从而提高查询性能。

本文作者:别调P
本文链接:https://blog.bietiaop.com/2023/06/23/database/mysql/cha-xun-yu-ju-you-hua/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可