1,033,990行のテーブル「questions」を持つデータベース「algebra」があります。レコードには、INTである「解決済み」属性があります。簡単なクエリがあります
select count(*) from questions where solved = 0
CPUが似ている2台のサーバーがあります。両方のサーバーで、テーブルは同じです。 (データベースは本番環境のレプリカです)。それらはSSD上にあります。 1つのサーバーにはUbuntu 14.04とMySQL 5.5.49があり、別のサーバーにはUbuntu 16.04とMySQL 5.7.12があります。
問題は、このクエリがMySQL 5.5では0.009秒しかかかりませんが、MySQL 5.7では0.304秒かかることです。これは34倍遅いです!!!
クエリプランはほぼ同じです。
遅いサーバー:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE questions NULL index NULL by_topic_solved 97 NULL 1033990 10.00 Using where; Using index
高速サーバー:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE questions index NULL by_topic_solved 97 NULL 1033989 Using where; Using index
なぜこれが私を困惑させるのか。この新しい5.7セットアップで他のより複雑なパフォーマンスの問題を見てきましたが、これは基礎となるクエリの観点から取り組むべき最も単純な問題です。
これについての説明やどこから始めればよいかを把握しています。 my.cnfは、2つの間でほぼ同じでした。どんな提案もありがたく受け入れられます。
私はこの問題を完全に理解しました。新しいmysqlでは、query_cache_type = OFFのデフォルト設定により、クエリキャッシュが無効になっています。 query_cache_type = 1を設定してクエリキャッシュを再度有効にすると、すぐにパフォーマンスが向上しました。私のサイトではINSERT/UPDATEクエリの100倍のSELECTクエリを使用しているので、クエリキャッシュを使用することは理にかなっています。この方向に目を向けてくれてありがとう!