【发布时间】:2014-07-23 16:03:13
【问题描述】:
首先抱歉,我是法国人,英语说得不太好。
我的索引有一个相当奇怪的问题。
我的表 t_bloc(我的表包含所有帖子)
t_bloc
CREATE TABLE `t_bloc` (
`id_bloc` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_rubrique` int(10) unsigned NOT NULL DEFAULT '0',
`titre` varchar(100) NOT NULL DEFAULT 'A compléter',
`contenu` text NOT NULL,
`titre_page` varchar(100) NOT NULL,
`desc_courte` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL,
`follow_url` tinyint(1) unsigned NOT NULL DEFAULT '1' ,
`image` varchar(120) NOT NULL,
`video` varchar(120) NOT NULL,
`note` tinyint(3) unsigned NOT NULL DEFAULT '0',
`champopt1` text NOT NULL,
`champopt2` text NOT NULL,
`permalien` varchar(100) NOT NULL,
`en_ligne` tinyint(1) NOT NULL DEFAULT '0',
`id_utilisateur` int(10) unsigned NOT NULL DEFAULT '1' ,
`date_crea` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`date_modif` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`nb_commentaires` smallint(5) unsigned NOT NULL DEFAULT '0',
`nb_jaimes` int(10) unsigned NOT NULL DEFAULT '0',
`nb_jaimespas` int(10) unsigned NOT NULL DEFAULT '0',
`pourcentage_jaimes` smallint(2) unsigned NOT NULL DEFAULT '0' ,
`niveau_classement` tinyint(1) unsigned NOT NULL DEFAULT '1' ,
`id_bloc_parent` int(10) unsigned NOT NULL DEFAULT '0' ,
`id_membre_bloc` int(10) unsigned NOT NULL DEFAULT '0' ,
`valeur_pts_bloc` smallint(5) unsigned NOT NULL DEFAULT '0' ,
`commentaires_actifs` tinyint(1) unsigned NOT NULL DEFAULT '1' ,
PRIMARY KEY (`id_bloc`),
KEY `date_modif` (`date_modif`),
KEY `id_bloc_parent` (`id_bloc_parent`),
KEY `idx_rub_ligne_niv_etc` (`id_rubrique`,`en_ligne`,`niveau_classement`,`note`,`pourcentage_jaimes`,`date_modif`),
KEY `idx_tri` (`en_ligne`,`niveau_classement`,`note`,`pourcentage_jaimes`,`date_modif`),
KEY `idx_ligne_membre` (`en_ligne`,`id_membre_bloc`,`id_rubrique`),
KEY `id_membre_bloc` (`id_membre_bloc`),
KEY `idx_rub_ligne_date` (`id_rubrique`,`en_ligne`,`date_modif`,`id_bloc`),
KEY `idx_ligne_date` (`en_ligne`,`date_modif`),
FULLTEXT KEY `idx_fullindex` (`titre`,`contenu`)
) ENGINE=MyISAM AUTO_INCREMENT=456469 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
我的表 t_taxon_bloc
t_taxon_bloc
CREATE TABLE `t_taxon_bloc` (
`id_taxon` int(10) unsigned NOT NULL,
`id_bloc` int(10) unsigned NOT NULL,
`url_plateforme` varchar(255) NOT NULL,
`width_flash` smallint(5) unsigned NOT NULL,
`height_flash` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id_taxon`,`id_bloc`),
KEY `id_bloc` (`id_bloc`),
KEY `id_taxon` (`id_taxon`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
执行此查询时遇到问题:
select b.id_bloc FROM t_bloc as b WHERE b.en_ligne = 1 AND EXISTS ( SELECT 1 FROM t_taxon_bloc AS TB WHERE TB.id_bloc=B.id_bloc AND TB.id_taxon= 83) ORDER BY b.en_ligne DESC, b.date_modif DESC LIMIT 0, 20
我得到以下解释:
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
PRIMARY
b
ref
idx_tri,idx_ligne_membre,idx_ligne_date
idx_ligne_date
1
const
58210
Using where
2
DEPENDENT SUBQUERY
TB
eq_ref
PRIMARY,id_bloc,id_taxon
PRIMARY
8
const,sitajeuxtestbourrage.b.id_bloc
1
Using index
它没有完全使用 idx_ligne_date 索引和 rows = 表中的所有行
额外 = « 使用 Where »
但是如果我创建以下索引 idx_ligne_date_idbloc (en_ligne, date_modif, id_bloc) , 索引的使用好一点,应用程序运行的快一点。
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
PRIMARY
b
ref
idx_tri,idx_ligne_membre,idx_ligne_date_idbloc
idx_ligne_date_idbloc
1
const
58252
Using where; Using index
2
DEPENDENT SUBQUERY
TB
eq_ref
PRIMARY,id_bloc,id_taxon
PRIMARY
8
const,sitajeuxtestbourrage.b.id_bloc
1
Using index
额外 = « 使用 Where,使用索引 »
我的问题:
id_bloc 没有出现在 where 和 order by 子句中,为什么我需要在我的多个索引上添加 id_bloc ? 为什么行 =(再次)我的所有表格?而不是 20 (LIMIT 0,20)
【问题讨论】: