【发布时间】:2021-11-11 19:46:45
【问题描述】:
目前,我在网站上面临一个相当慢的查询,这也会在更多流量时减慢服务器的速度。如何重写查询或我可以编写什么索引以避免“使用临时;使用文件排序”?如果没有“order by”,一切都会快速运行,但没有想要的结果/顺序。
SELECT cams.name, models.gender, TIMESTAMPDIFF(YEAR, models.birthdate, CURRENT_DATE) AS age, lcs.viewers
FROM cams
LEFT JOIN cam_tags ON cams.id = cam_tags.cam_id
INNER JOIN tags ON cam_tags.tag_id = tags.id
LEFT JOIN model_cams ON cams.id = model_cams.cam_id
LEFT JOIN models ON model_cams.model_id = models.id
LEFT JOIN latest_cam_stats lcs ON cams.id = lcs.cam_id
WHERE tags.name = '?'
ORDER BY lcs.time_stamp_id DESC, lcs.viewers DESC
LIMIT 24 OFFSET 96;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | tags | NULL | const | PRIMARY,tags_name_uindex | tags_name_uindex | 766 | const | 1 | 100 | Using temporary; Using filesort |
| 1 | SIMPLE | cam_tags | NULL | ref | PRIMARY,cam_tags_cams_id_fk,cam_tags_tags_id_fk | cam_tags_tags_id_fk | 4 | const | 75565047 | 100 | Using where |
| 1 | SIMPLE | cams | NULL | eq_ref | PRIMARY | PRIMARY | 4 | cam_tags.cam_id | 1 | 100 | NULL |
| 1 | SIMPLE | model_cams | NULL | eq_ref | model_platforms_platforms_id_fk | model_platforms_platforms_id_fk | 4 | cam_tags.cam_id | 1 | 100 | NULL |
| 1 | SIMPLE | models | NULL | eq_ref | PRIMARY | PRIMARY | 4 | model_cams.model_id | 1 | 100 | NULL |
| 1 | SIMPLE | lcs | NULL | eq_ref | PRIMARY,latest_cam_stats_cam_id_time_stamp_id_viewers_index | PRIMARY | 4 | cam_tags.cam_id | 1 | 100 | NULL |
【问题讨论】:
标签: mysql performance indexing mariadb