MySQL のパフォーマンスについて質問があります。これらは私のテーブルです:
(約 140.000 レコード)
CREATE TABLE IF NOT EXISTS `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`label` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`title` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`intro` text COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`date` int(11) NOT NULL,
`active` int(1) NOT NULL,
`language_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`indexed` int(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=132911 ;
(約 400.000 レコード)
CREATE TABLE IF NOT EXISTS `article_category` (
`article_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
このカウント クエリの実行:
SELECT SQL_NO_CACHE COUNT(id) as total
FROM (`article`)
LEFT JOIN `article_category` ON `article_category`.`article_id` = `article`.`id`
WHERE `article`.`language_id` = 1
AND `article_category`.`category_id` = '<catid>'
このクエリは多くのリソースを必要とするため、このクエリを最適化する方法を考えています。実行後はキャッシュされるので、最初の実行後は問題ありません。
EXPLAIN 関数の実行:
インデックス作成後:
ALTER TABLE `article_category` ADD INDEX ( `article_id` , `category_id` ) ;
インデックスを追加し、LEFT JOIN を JOIN に変更すると、クエリの実行速度が大幅に向上します。これらの迅速な返信をありがとう:)
現在使用しているクエリ (language_id は必要ないので削除しました):
SELECT COUNT(id) as total
FROM (`article`)
JOIN `article_category` ON `article_category`.`article_id` = `article`.`id`
AND `article_category`.`category_id` = '<catid>'
インデックスの強制について何か読んだことがありますが、テーブルには既にインデックスが作成されているので、それはもう必要ないと思いますよね?
どうもありがとう!
マルティン