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 BY
upload\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)。