私は以下のような同様のテーブルスキームを使用するWebアプリケーションを持っています。単に私は記事の選択を最適化したいと思います。記事は与えられたタグに基づいて選択されます。たとえば、タグが 'iphone'の場合、クエリは先月の 'iphone'に関するすべての公開記事を出力するはずです。
MySQLクエリの最適化
次
CREATE TABLE `article` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(100) NOT NULL,
`body` varchar(200) NOT NULL,
`date` timestamp NOT NULL default CURRENT_TIMESTAMP,
`author_id` int(11) NOT NULL,
`section` varchar(30) NOT NULL,
`status` int(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE `tags` (
`name` varchar(30) NOT NULL,
`article_id` int(11) NOT NULL,
PRIMARY KEY (`name`,`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
は私のMySQLのクエリで
explain select article.id,users.username,article.title
from article,users,tags
where article.id=tags.article_id and tags.name = 'iphone4'
and article.author_id=users.id and article.status = '1'
and article.section = 'mobile'
and article.date > '2010-02-07 13:25:46'
ORDER BY tags.article_id DESC
出力は
id select_type table type possible_keys key key_len ref rows Extra <br>
1 SIMPLE tags ref PRIMARY PRIMARY 92 const 55 Using where; Using index <br>
1 SIMPLE article eq_ref PRIMARY PRIMARY 4 test.tags.article_id 1 Using where <br>
1 SIMPLE users eq_ref PRIMARY PRIMARY 4 test.article.author_id 1 <br>
では、より多くのそれを最適化することが可能ですか?
は、私にはよさそうです。 –
一般的な規則は、結合および/またはwhere句で使用するフィールドにインデックスを付けることです。しかし、あなたのDBが非常に大きくなるまで、「tags.name」や「article.status」などのインデックスを持たない*などは重要ではありません。しかし、物事が後で減速するなら、それは調べるべきものです。 –