SQL:帮我优化 mySQL

标签 sql mysql database database-design optimization

我正在寻求优化我的 SQL。

我的数据库架构是:

  • home_id
  • 地址
  • 城市
  • 状态
  • 压缩
  • primary_photo_group_id

HOME_PHOTOS

  • photo_id(主键)
  • home_id(家庭主键)
  • photo_group_id(一个照片组是同一张图片,从缩略图调整到大尺寸)
  • home_photo_type_id(图像的大小,无论是缩略图还是大尺寸)
  • photo_url_dir(存储照片的文件系统位置)

问题

“家”很可能没有与该家相关联的照片。在这种情况下,primary_photo_group_id = 0。否则,primary_photo_group_id` 等于用作主照片的照片的 group_id。

慢 SQL(UNION 的 b/c)

SELECT  homes.home_id,
    address,
    city,
    state,
    zip,
    photo_id,
    photo_url_dir
FROM homes, home_photos
WHERE homes.home_id = home_photos.home_id
AND primary_photo_group_id = home_photo_group_id
AND home_photo_type_id = 2

UNION

SELECT  homes.home_id,
    address,
    city,
    state,
    zip,
    null,
    null
FROM homes
WHERE primary_photo_group_id = 0

我想做什么

我想去掉 UNION,因为我必须对整个表进行 2 次回溯搜索。我怎样才能去掉 UNION,因为我需要检查 primary_photo_group_id = 0 的情况,如果它不等于 0,则查询 home_photos

这是需要发生的伪代码

SELECT  homes.home_id,
    address,
    city,
    state,
    zip,
    photo_id,  (include only if primary_photo_group_id != 0)
    photo_url_dir  (include only if primary_photo_group_id != 0)
FROM homes,
    home_photos (include only if primary_photo_group_id != 0)
WHERE 
    primary_photo_group_id = 0
ELSE
    homes.home_id = home_photos.home_id
        AND primary_photo_group_id = home_photo_group_id
        AND home_photo_type_id = 2

最佳答案

如果第二个查询比第一个慢,那是因为你在 {home_id, primary_photo_group_id} 上有一个索引(或者可能只是 {home_id}),但不是单独在 {primary_photo_group_id} 上。如果您想提高查找该列的性能,则需要该列的索引。

关于SQL:帮我优化 mySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1039771/

相关文章:

sql - 变量作为最高值

mysql - 使用 GROUP BY 进行 SELECT 并显示两个表的总计

java - 如何验证表中某列是否存在

iphone - 以编程方式在 iPhone 中批量导入 SQLite 中的 SQL 查询

mysql - 错误 1025 (HY000) : Error on rename of .。 (错误号:-1)

sql - 将 'GO' 语句添加到 Entity Framework 迁移

sql - SQL 服务器中的 FOR XML PATH 和 [text()]

大量字段的MySQL结构

mysql - 表总和排序规则为 latin1_swedish_ci,但所有单独的表均显示 utf8_general_ci

mysql - 使用多个 JOIN 优化数据库