這裏,因爲它是敏感信息,我要添加查詢的一部分,我會用不實的名字:MySQL的忽略指數即使使用索引或力指數
SELECT
`entity`.`id`,
`entity`.`requirements`,
`entity`.`description`,
`entity`.`status`,
`entity_videos`.`length`,
`entity_videos`.`quality`,
`states`.`name`,
`uploads`.`id`,
`uploads`.`name`
FROM `entity`
LEFT JOIN `states` ON `states`.`id` = `entity`.`state_id`
INNER JOIN `uploads` FORCE INDEX (`uploadable_id_index`)
ON `uploads`.`uploadable_type` = 'Entity'
AND `uploads`.`category` = 'Icon'
AND (`uploads`.`uploadable_id` = `entity`.`id`
OR `uploads`.`uploadable_id` = `entity`.`parent_entity_for_icon`
)
INNER JOIN `entity_videos` FORCE INDEX (entity_videos_entity_id_index)
ON `entity_videos`.`entity_id` = `entity`.`id`
WHERE `entity`.`status` = 'active'
的問題是,MySQL優化不想使用uploadable_id_index
索引。解釋的部分:
據我所知FORCE INDEX
是力優化器使用索引除外優化程序無法使用索引的情況。我應該怎麼做才能強制該索引,而不是對錶格進行全面掃描? 我試圖刪除entity_videos_entity_id_index
也試圖將uploads
表信息添加到where子句,但沒有爲我工作。有任何想法嗎?非常感謝您的任何幫助
更新時間:
隨着@Barmar和@PaulSpiegel的幫助下,我發現,問題是(uploads.uploadable_id = entity.id OR uploads.uploadable_id = entity.parent_entity_for_icon)
。並與查詢了一段時間,我發現我的情況是最好的解決辦法是打:
SELECT
`entity`.`id`,
`entity`.`requirements`,
`entity`.`description`,
`entity`.`status`,
`entity_videos`.`length`,
`entity_videos`.`quality`,
`states`.`name`,
`icon`.`id`,
`icon`.`name`,
`parent_offer_icon`.`id`,
`parent_offer_icon`.`name`
FROM `entity`
LEFT JOIN `states` ON `states`.`id` = `entity`.`state_id`
LEFT JOIN `uploads` as `icon` FORCE INDEX (`uploadable_id_index`)
ON `icon`.`uploadable_type` = 'Entity'
AND `icon`.`category` = 'Icon'
AND `icon`.`uploadable_id` = `entity`.`id`
LEFT JOIN `uploads` as `parent_offer_icon` FORCE INDEX (`uploadable_id_index`)
ON `parent_offer_icon`.`uploadable_type` = 'Entity'
AND `parent_offer_icon`.`category` = 'Icon'
AND `parent_offer_icon`.`uploadable_id` = `entity`.`parent_entity_for_icon`
INNER JOIN `entity_videos` FORCE INDEX (entity_videos_entity_id_index)
ON `entity_videos`.`entity_id` = `entity`.`id`
WHERE `entity`.`status` = 'active'
AND (parent_offer_icon.id IS NOT NULL
OR icon.id IS NOT NULL)
我仍然開放給其他建議:)
「OR」條件可能是問題所在。嘗試使用'uploadable_id IN(entity.id,entity.parent_entity_for_icon)' – Barmar
@Barmar謝謝你的建議,但它也不起作用。我忘記了,前幾天數據庫優化器中的記錄數量少得多的時候,選擇該索引,現在真的可以更快地完成全面掃描而不是使用索引了嗎? –
當表變大時,通常索引更有用。但也許該指數的基數太低。使用'SHOW INDEX FROM uploads;'來查看。 – Barmar