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

CHAR / VARCHARインデックスを使用すると、MySQLクエリのパフォーマンスが非常に悪いのはなぜですか?

    明らかに、問題はクエリがインデックススキャンを実行していることです。別のアプローチは、同じ最初と最後の値に対して2つのインデックス検索を実行し、計算のためにインデックスのメタ情報を使用することです。あなたの観察に基づいて、MySQLは両方を行います。

    この答えの残りは推測です。

    パフォーマンスが200,000倍遅くなるのではなく、「わずか」300倍遅くなる理由は、インデックスの読み取りのオーバーヘッドが原因です。実際にエントリをスキャンすることは、必要な他の操作と比較して非常に高速です。

    比較に関しては、数値と文字列には根本的な違いがあります。エンジンは、2つの数値のビット表現を調べて、それらが同じか異なるかを認識することができます。残念ながら、文字列の場合、エンコーディング/照合を考慮する必要があります。だからこそ、価値観を見極める必要があると思います。

    正確に216,000部ある場合は可能性があります 同じ文字列の場合、MySQLはインデックスのメタデータを使用してカウントを実行できます。言い換えると、インデクサーは、正確な同等性の比較にメタデータを使用するのに十分なほど賢いです。ただし、エンコーディングを考慮に入れるほど賢くはありません。



    1. MySQLで主キーを無視して重複行を見つける7つの方法

    2. MySQL8共通テーブル式CTE

    3. forループを使用して.csvファイルにスプールする

    4. PostgreSQL:複数列の一意性制約に基づく自動インクリメント