mysqlクエリ重複するデータのSQL最適化スキーム

992 ワード

mysqlでは、大文字と小文字の重複を区別しないデータがクエリーされ、サブクエリーでupper関数を使用して条件を大文字に変換することがよくあります.次のようになります.
 
  
select * from staticcatalogue WHERE UPPER(Source) IN (SELECT UPPER(Source) FROM staticcatalogue GROUP BY UPPER(Source) having count(UPPER(Source))>1) ORDER BY upper(Source) DESC;

この文の実行効率は非常に低く、特にSourceフィールドにインデックスが付けられていません.特に最も忌み嫌うのはクエリー条件の中で関数を使って、これは極めて大きいクエリーのスピードを下げて、もし10万件のデータの内の10分以内にまたデータを得ることができるならば、もし何十万件のクエリーならば、直接サーバーを走って死んで、この時1つの臨時の表を通じて、しかもインデックスをプラスして、更にクエリーすることができます.このようにして多くの速度を高めることができます
 
  
CREATE TABLE staticcatalogue_tmp SELECT UPPER(Source) AS Source FROM staticcatalogue GROUP BY UPPER(Source) having count(UPPER(Source))>1;
ALTER TABLE staticcatalogue_tmp add INDEX TX_1 (Source);
select s.* from staticcatalogue s WHERE UPPER(s.Source) IN (SELECT st.Source FROM staticcatalogue_tmp st) ORDER BY UPPER(s.Source) DESC ;

以上が本稿のsql最適化案のすべてであり、皆さんが好きになってほしい.