私は「algebra」というデータベースを持っており、そこには1,033,990行の「questions」というテーブルがあります。レコードにはINTである「solved」という属性があります。簡単なクエリがあります。
select count(*) from questions where solved = 0
同様の CPU を搭載した 2 台のサーバーがあります。両方のサーバーのテーブルは同じです (データベースは本番環境のレプリカです)。これらは SSD 上にあります。1 台のサーバーには Ubuntu 14.04 と MySQL 5.5.49 がインストールされており、もう 1 台のサーバーには 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 つともほぼ同じでした。ご提案があれば、ぜひお寄せください。
答え1
この問題を完全に理解しました。変更されたのは、新しい MySQL では、query_cache_type = OFF のデフォルト設定によりクエリ キャッシュが無効になっていることです。query_cache_type=1 に設定してクエリ キャッシュを再度有効にすると、パフォーマンスがすぐに向上しました。私のサイトでは INSERT/UPDATE クエリよりも 100 倍多くの SELECT クエリを使用しているため、クエリ キャッシュを使用することは理にかなっています。この方向を見るように指示していただき、ありがとうございます。