Mysql 具有左联接的慢速选择查询为null,并限制结果
我将以下查询记录为慢速查询:Mysql 具有左联接的慢速选择查询为null,并限制结果,mysql,select,performance,Mysql,Select,Performance,我将以下查询记录为慢速查询: EXPLAIN EXTENDED SELECT * FROM ( `photo_data` ) LEFT JOIN `deleted_photos` ON `deleted_photos`.`photo_id` = `photo_data`.`photo_id` WHERE `deleted_photos`.`photo_id` IS NULL ORDER BY `upload_date` DESC LIMIT 50 下面是explain的输出: id sel
EXPLAIN EXTENDED SELECT *
FROM (
`photo_data`
)
LEFT JOIN `deleted_photos` ON `deleted_photos`.`photo_id` = `photo_data`.`photo_id`
WHERE `deleted_photos`.`photo_id` IS NULL
ORDER BY `upload_date` DESC
LIMIT 50
下面是explain的输出:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE photo_data index NULL upload_date 8 NULL 142523
1 SIMPLE deleted_photos eq_ref photo_id photo_id 767 tbc.photo_data.photo_id 1 Using where; Not exists
我可以看到,它必须通过所有142K记录才能从数据库中取出最新的50条
我有两个索引:
UNIQUE KEY `photo_id` (`photo_id`),
KEY `upload_date` (`upload_date`)
我希望上传日期的索引键能帮助限制行数。你有没有想过我可以做些什么来加速这个过程?你可以在你的
photo\u data
表中添加一个字段,显示它是否被删除,而不必通过加入另一个表来找出这个事实。然后,如果你在(已删除,上载日期)上添加索引,你的查询应该会非常快。因此,我分析了新的查询:从(photo\u data
)中选择photo\u id
,photo\u data
,image\u缩略图
,photo\u说明
)其中,deleted
='0'ORDER BYupload\u date
desc LIMIT 50此新的花费1.2秒排序。。。。我在“已删除”上添加了一个新的索引…Steudel:你是否尝试过像我在帖子中建议的那样在(已删除,上载日期)
上添加一个组合索引?我不记得创建索引的确切语法,但大致是这样的:altertablephoto\u data addindex deleted\u upload\u date(deleted,upload\u date)
。我认为这将对查询的速度产生巨大的影响,因为它应该从O(n logn)变为几乎O(1)。