我有這個疑問:mysql命令通過優化連接和哪來
SELECT SQL_NO_CACHE DISTINCT `photos`.*
FROM `photos`
INNER JOIN `locations` ON `photos`.`location_id` = `locations`.`id`
LEFT OUTER JOIN `albums_photos` ON `photos`.`id` = `albums_photos`.`photo_id`
LEFT OUTER JOIN `facets` ON `photos`.`id` = `facets`.`photo_id`
LEFT OUTER JOIN `source_tags` ON `facets`.`source_id` = `source_tags`.`id`
LEFT OUTER JOIN `source_comments` ON `facets`.`source_id` = `source_comments`.`id`
WHERE (`photos`.`date_taken` <= '2017-08-24')
AND (photos.status != 1 or photos.status is NULL)
ORDER BY `photos`.`date_taken` DESC
LIMIT 75
OFFSET 0
它需要這需要6-7秒來運行。當我拿出Order by子句時:
SELECT SQL_NO_CACHE DISTINCT `photos`.*
FROM `photos`
INNER JOIN `locations` ON `photos`.`location_id` = `locations`.`id`
LEFT OUTER JOIN `albums_photos` ON `photos`.`id` = `albums_photos`.`photo_id`
LEFT OUTER JOIN `facets` ON `photos`.`id` = `facets`.`photo_id`
LEFT OUTER JOIN `source_tags` ON `facets`.`source_id` = `source_tags`.`id`
LEFT OUTER JOIN `source_comments` ON `facets`.`source_id` = `source_comments`.`id`
WHERE (`photos`.`date_taken` <= '2017-08-24')
AND (photos.status != 1 or photos.status is NULL)
LIMIT 75
OFFSET 0
運行需要0.025秒。所以顯然沒有優化。 我有照片,這些指標
Table, Non_unique, Key_name, Seq_in_index, Column_name, Collation, Cardinality, Sub_part, Packed, Null, Index_type, Comment, Index_comment
photos, 0, PRIMARY, 1, id, A, 21069, , , , BTREE, ,
photos, 1, index_photos_on_location_id, 1, location_id, A, 468, , , YES, BTREE, ,
photos, 1, index_photos_on_date_taken, 1, date_taken, A, 21069, , , YES, BTREE, ,
photos, 1, index_photos_on_status, 1, status, A, 2, , , YES, BTREE, ,
photos, 1, index_photos_on_phash, 1, phash, A, 21069, , , YES, BTREE, ,
照片設置爲每個:
Field, Type, Null, Key, Default, Extra
id, bigint(20), NO, PRI, , auto_increment
date_taken, datetime, YES, MUL, ,
created_at, datetime, NO, , ,
updated_at, datetime, NO, , ,
file_extension, varchar(255), YES, , ,
file_size, int(11), YES, , ,
location_id, bigint(20), YES, MUL, ,
make, varchar(255), YES, , ,
model, varchar(255), YES, , ,
original_height, int(11), YES, , ,
original_width, int(11), YES, , ,
longitude, decimal(16,10), YES, , ,
latitude, decimal(16,10), YES, , ,
status, int(11), YES, MUL, 0,
phash, varchar(255), YES, MUL, ,
org_id, int(11), YES, , ,
lg_id, int(11), YES, , ,
md_id, int(11), YES, , ,
tm_id, int(11), YES, , ,
我能做些什麼。我應該在我的應用程序(rails或JS)中進行排序嗎?
- 編輯 -
我要補充的是,當我拿出所有的聯接,但離開的時候訂單下降到低於秒。讓我覺得我需要在連接的列和date_taken之間的索引?
SELECT SQL_NO_CACHE DISTINCT `photos`.*
FROM `photos`
WHERE (`photos`.`date_taken` <= '2017-08-24')
AND (photos.status != 1 or photos.status is NULL)
#AND (`photos`.`date_taken` is not null)
ORDER BY `photos`.`date_taken` DESC
LIMIT 75
OFFSET 0;
你有多少行在表格進行適當的指數? .. photos.id是auto_increment?(每行有一個不同的id?) – scaisEdge
添加了表定義。是的,它是auto_increment。我有21000行和增長... – martin
有一篇文章解釋延遲行查找解釋。也許這可以幫助。 – Strawberry