~100 万エントリの mySQL DB があります。
クエリを実行します。
SELECT a.id as aid, a.title as atitle, a.slug, summary,
a.link as alink, author, published, image, a.cat as acat,
a.rss as arss, a.site as asite
FROM articles a
ORDER BY published DESC
LIMIT 616150, 50;
読み込みに5分以上かかります。
私のテーブルとインデックス:
CREATE TABLE IF NOT EXISTS `articles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`slug` varchar(255) NOT NULL,
`summary` text NOT NULL,
`link` text NOT NULL,
`author` varchar(255) NOT NULL,
`published` datetime NOT NULL,
`image` text NOT NULL,
`cat` int(11) NOT NULL,
`rss` int(11) NOT NULL,
`site` int(11) NOT NULL,
`bitly` varchar(255) NOT NULL,
`checked` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `title` (`title`),
KEY `cat` (`cat`),
KEY `published` (`published`),
KEY `site` (`site`),
KEY `rss` (`rss`),
KEY `checked` (`checked`),
KEY `id_publ_index` (`id`,`published`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1230234;
何を説明すると言う:
mysql> EXPLAIN EXTENDED SELECT a.id as aid, a.title as atitle, a.slug, summary, a.link as alink, author, published, image, a.cat as acat, a.rss as arss, a.site asite FROM 記事として ORDER BY 公開された DESC LIMIT 616150, 50; +----+-------------+-------+-------+-------------- -------------+---------+------+--------+---------- +------+ | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 フィルタリングされた | エクストラ | +----+-------------+-------+-------+-------------- -------------+---------+------+--------+---------- +------+ | | 1 | シンプル | | | インデックス | ヌル | 公開 | 8 | ヌル | 616200 | 152.94 | | | +----+-------------+-------+-------+-------------- -------------+---------+------+--------+---------- +------+ セット内の 1 行、1 警告 (0.46 秒)
このクエリを最適化する方法のヒントはありますか? mySQL が、要求された 50 行だけでなく、616200 行すべてを読み取る必要があるのはなぜですか?
お時間をいただきありがとうございます。