SQLデータベースの次のパフォーマンスの問題に直面しました。約1,000,000エントリの「users」と呼ばれるSQLテーブルで、今日の登録数の決定に許容できない28秒かかりました。 登録の時間は、「作成済み」列に「Ymd H:i:s」形式で保存されました。
使用したクエリ
SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';
DATETIME形式の「作成済み」列にすでにインデックスがありましたが、この読み込み時間につながりました
ALTER TABLE `users` ADD INDEX `created` (`created`);
設定されていました。 パフォーマンスが低下する理由は、DATE関数の呼び出しです。「作成された」というインデックス付きの列がDATE関数によって送信され、インデックスが無効になります。 クエリオプティマイザは「作成済み」のみを認識し、DATE(作成済み)の結果は認識しません。 最適化されたクエリ
SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';
0.4秒の時間で望ましい結果につながります。