1

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>'

インデックスの強制について何か読んだことがありますが、テーブルには既にインデックスが作成されているので、それはもう必要ないと思いますよね?

どうもありがとう!

マルティン

4

2 に答える 2

2

テーブルに必要なインデックスを作成していません

article_category- に複合索引を作成する(article_id, category_id)

テーブルarticle- に複合インデックスを作成する(id, language_id)

これで問題が解決しない場合は、Explain ステートメントを投稿してください。

于 2013-04-23T11:56:07.727 に答える