mysql - 在查询中添加第三个表会减慢结果时间

标签 mysql optimization

我正在使用一个查询,该查询在一秒钟内给出结果。

查询是,

SELECT creator.first_name, image.id, image.image_code, image.project, image.location, image.image_date, image.image_view, image.copyright 
FROM img_images image, img_creator creator 
WHERE creator.image_id = image.id AND (
(image.image_code LIKE '%text%') 
OR (image.project LIKE '%text%') 
OR (image.location LIKE '%text%')
OR (creator.first_name LIKE '%text%')) 
ORDER BY creator.first_name

现在,如果我在此查询中添加第三个表,大约需要 20 到 30 秒才能给出结果。

查询,

SELECT creator.first_name, image.id, image.image_code, image.project, image.location, image.image_date, image.image_view, image.copyright, sources.author 
FROM img_images image, img_creator creator, img_source sources 
WHERE creator.image_id = image.id AND sources.image_id = image.id AND (
(image.image_code LIKE '%text%') 
OR (image.project LIKE '%text%') 
OR (image.location LIKE '%text%')
OR (creator.first_name LIKE '%text%')) 
ORDER BY creator.first_name

如何优化此查询以快速给出响应? 所有表中都存在正确的索引。

最佳答案

有时,在没有过滤条件的表上强制左连接有助于 RDBMS 选择更好的计划:

SELECT creator.first_name, image.id, image.image_code, image.project, image.location,
       image.image_date, image.image_view, image.copyright, sources.author
FROM img_images image
JOIN img_creator creator ON (creator.image_id = image.id OR creator.first_name LIKE '%text%')
LEFT JOIN img_source sources ON (sources.image_id = image.id)
WHERE image.image_code LIKE '%text%' OR image.project LIKE '%text%' OR image.location LIKE '%text%'
ORDER BY creator.first_name;

此外,当结果集中的行数预计较小,但查询很复杂和/或涉及大型表时,我发现值得尝试单独查找单个值:

SELECT creator.first_name, image.id, image.image_code, image.project, image.location,
       image.image_date, image.image_view, image.copyright
       (SELECT author FROM img_source WHERE image_id = image.id) AS author
FROM img_images image
JOIN img_creator creator ON (creator.image_id = image.id OR creator.first_name LIKE '%text%')
WHERE image.image_code LIKE '%text%' OR image.project LIKE '%text%' OR image.location LIKE '%text%'
ORDER BY creator.first_name;

关于mysql - 在查询中添加第三个表会减慢结果时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36977485/

相关文章:

javascript - 为什么修改全局变量会增加 Chrome 中的内存使用量

5.0 和 5.6 上的 MySQL 查询解释效率

php - Codeigniter 增加 session 超时不起作用

java - 连接 Tomcat 6 和 MySQL 5(+ Plandora 项目管理软件)

mysql - 如何使用多个连接和子查询优化这个慢速查询

c++ - 类实例之间共享的类内部的 `enum` 定义,还是为每个实例复制的?

SQL如何更新同一个表中组的列的SUM

java - java中值重复时清理对象

php - 有没有办法在插入 MYSQL 时通知用户成功/错误?

mysql - 即使foreign_key_checks = 0,删除带有外键的表也会失败