2011-02-10 11 views
2

挨拶、Rails 2.3.5/MySQLキーの優先順位の問題。力指数

私は万行のカップルと、むしろ「大...」テーブルを探しています、と単純化のために表Aに、だから、この

create table data (
    user_id int ... 
    created_on datetime ... 
    ... 
    key (user_id), 
    key (created_on) 
    ... 
) engine = InnoDB; 

のように見えますクエリ... SELECT * FROMデータWHERE user_id = X and created_on = Y

クエリオプティマイザは、user_idよりもcreated_onを優先されていますが、今はFORCE INDEXを使用して問題を「強制」できますが、すべてのData.findとそれ以外のすべてのクエリ(何百もの変更)でそれを行う必要があります。

または

Iすることができます。

は、私は、可能な場合(つまり、..別FORCEインデックスは手動で入力していない他の矛盾が)使用 "データFORCEのINDEX(user_id_index)" をグローバルにRailsの2.3.5に影響を与えることができますmysqlクエリオプティマイザがより手動でインデックスを好む方法を変更しますか?私はテーブルデータの分析を実行してみました。クエリプランは変更されません。

+1

プライマリキーなし?あなたの唯一のinnodbクラスターインデックスを浪費するための哀れみ。 –

+0

@ f00:追加するには:PKが単調に伸びるならば、innodbのほうがいいです。 – zerkms

答えて

1

-danielは、複合インデックスuser_id + created_onだけではなくuser_idを作成し、すべてがうまくなります。

+0

私はそれを考えましたが、alter tableのダウンタイムは相当なもので、私はスレーブ/マスタースワップをしたくありません。 – Daniel

+0

@ダニエル:これはとにかく問題の唯一の解決策です。あなたは正しい方法に従うか、汚いハックを見つけることは自由です。 – zerkms

+0

さて、私は照合を直接変更するための汚いトリックがあるかもしれないと思っていました... "データセットで"と言ってくださいcollat​​ion = 5 index = "created_on_index"のように、クエリプランナの作成方法に影響を与えることができます。長期的には良い解決策ではありませんが、次回のスケジュールされたダウンタイムウィンドウまでは良いでしょう。 – Daniel

関連する問題