我想获得关于什么/如何使用索引和更好的 SQL 查询的想法和想法。
这是我的 SQL 查询示例:
SELECT albums.id AS album_id, albums.name AS album_name, albums.upc, albums.status,
albumstatus.description AS album_status, DATE_FORMAT(albums.created, '%Y-%m-%d') AS created_date,
albuminfos.label
FROM albums,albumstatus, albumtypes, albuminfos
WHERE albums.status = albumstatus.id AND albumtypes.id = albums.albumtype_id AND albums.id = albuminfos.id
AND albums.account_id = 9999
AND albums.status IN (1, 2)
我尝试使用 mysql EXPLAIN 输出:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE albums ref PRIMARY,account_id,status,albumtype_id account_id 4 const 4148 Using where
1 SIMPLE albumstatus eq_ref PRIMARY,id PRIMARY 4 albums.status 1 Using where
1 SIMPLE albumtypes eq_ref PRIMARY PRIMARY 1 albums.albumtype_id 1 Using index
1 SIMPLE albuminfos eq_ref PRIMARY PRIMARY 4 albums.id 1
我经常使用 LEFT JOIN 并在主键上连接它们...我的 friend 告诉我使用索引来提高获得结果的速度。当我发现索引变慢时我感到很困惑写入查询的速度:INSERT、DELETE、UPDATE,其中 album 和 albuminfos 表可能随时有新的/更新的记录。所以我很迷茫,所以我想听听并从专业人士那里得到想法:
- 我的查询好吗?
- 在 mysql EXPLAIN 中我需要知道什么?
- 是否可以使用索引?如果是..如何?
- 我的设置是对还是错?
谢谢!
最佳答案
问题 1:
将联接与 where 子句分开(这样更易于阅读且更合乎逻辑),否则您的查询似乎以旧方式正确。
SELECT albums.id AS album_id, albums.name AS album_name, albums.upc, albums.status,
albumstatus.description AS album_status, DATE_FORMAT(albums.created, '%Y-%m-%d') AS created_date,
albuminfos.label
FROM albums
LEFT OUTER JOIN albumstatus sta ON albums.status = albumstatus.id
LEFT OUTER JOIN albumtypes typ ON albumtypes.id = albums.albumtype_id
LEFT OUTER JOIN albuminfos inf ON albums.id = albuminfos.id
WHERE albums.account_id = 9999 AND albums.status IN (1, 2) ;
你的索引是正确的。
对于复合索引(@ypercube):
ALTER TABLE albums ADD INDEX idx_account_id (account_id ASC, status ASC) ;
问题 2:
Force MySQL to use two indexes on a Join
但 MySQL 通常做得很好。
问题 3:
您的表相册中有多少条记录?
关于php - Mysql - 查询和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399530/