2016-10-26 26 views
0

當存在多個JOIN時,是否有辦法在Rails中激活具有活動記錄的JOIN上的索引?如何使用主動記錄指定JOIN中的'USE INDEX'

我想是要生成的SQL結束:

SELECT * 
FROM table1 
INNER JOIN table2 
ON table1.id = table2.id 
INNER JOIN table3 USE INDEX('my_index') 
ON table2.new_id = table3.new_id 

希望這樣的事情是可能的?

+0

哪個數據庫?通常數據庫會決定是否使用索引。如果您在正確的字段上創建索引,並且數據庫的查詢計劃員認爲該索引對您提交的查詢有意義,則它將使用該索引。 –

+0

@DaveSlutzkin這會很好,但至少MySQL在使用現有索引時有時會做出非常糟糕的決定。 – spickermann

+0

讓我們看看實際的查詢,再加上'SHOW CREATE TABLE'。也許我們可以改變一些東西來達到目的。 –

回答

4

Rails不支持開箱即用的連接。但是,你可以寫傳遞一個字符串給joins描述你想要什麼:

Post 
    .joins(:author) 
    .joins("INNER JOIN comments USE INDEX('myindex') ON comments.post_id = posts.id") 

我用postsuserscomments而不是table1table3,因爲table1等不遵守Rails的命名約定。