MySQLは巨大なテーブルと単純なSELECTにFORCE INDEXを必要とします
さまざまなソースからの記事をMySQLテーブルに保存し、ユーザーがそれらの記事を日付順に取得できるようにするアプリケーションがあります。記事は常にソースによってフィルタリングされるため、クライアントSELECTの場合は常に WHERE source_id IN (...,...) ORDER BY date DESC/ASC INを使用しているのは、ユーザーが多くのサブスクリプションを持っているためです(一部には数千のサブスクリプションがあります)。 次に、articlesテーブルのスキーマを示します。 CREATE TABLE `articles` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `source_id` INTEGER(11) UNSIGNED NOT NULL, `date` DOUBLE(16,6) NOT NULL, PRIMARY KEY (`id`), KEY `source_id_date` (`source_id`, `date`), KEY `date` (`date`) )ENGINE=InnoDB AUTO_INCREMENT=1 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT=''; (日付)インデックスが必要です。ソースでフィルタリングせずに、このテーブルでバックグラウンド操作を実行している場合があるためです。ただし、ユーザーはこれを行うことはできません。 テーブルには約10億のレコードがあります(そうです、将来のためにシャーディングを検討しています...)。典型的なクエリは次のようになります。 …