sql >> データベース >  >> RDS >> Mysql

LIKE用語のMySQLクエリ最適化%ORDER BY int

    「4000万の名前を使用したワイルドカード検索に最適なインデックスの作成」という別の質問がありました。さて、あなたは4000万のレコードを持っています。

    次の式を検討してください:

    x = COUNT(DISTINCT values in a column) / COUNT(values in a column)
    

    列のインデックスははるかに優れており、xに近くなります。 1の場合、すべての値が異なり、重複がないため、インデックスは非常に高速です。

    今、あなたは'john%'を探しています。それは4文字とオープンエンドです。どの文字が重要ではない場合、DBは26 * 26 * 26 * 26=456976の個別の値を処理する必要があります。それを上記の式と4000万件のレコードに入れてください。 xを取得します の0,0114244。

    再びしきい値が何であるかはわかりませんが、IIRCは0,1か何かです。したがって、xの場合 0.1を超える場合はインデックスが使用され、低い場合は使用されません。

    どうしてこんなことに?インデックスを使用すると、処理速度が低下する可能性があります。DBはインデックスを確認し、そのインデックスで適切なレコードが物理ハードドライブのどの位置にあるかを確認してから、そのレコードを取得する必要があります。したがって、xが10%未満の場合は、テーブル全体のスキャンを実行するだけの方が高速です。

    要約すると、あなたのような弱いインデックスが1つしかない4,000万件のレコードをフィルタリングすることは、まったく役に立ちません。



    1. SQL ALTER TABLE構文–DBMSによってリストされます

    2. Postgresqlテーブルの最大(使用可能な)行数

    3. 1つまたは2つの列に基づいて、重複するすべての行を選択しますか?

    4. エラーの取得:pgsqlをrailsで動作させようとすると、ユーザーpostgresのピア認証が失敗しました