【问题标题】:Mysql doesn't use my Index correctlyMysql 没有正确使用我的索引
【发布时间】: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)

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    您似乎误解了 Extra 列中“使用索引”的含义。看看这个法语解释:http://use-the-index-luke.com/fr/sql/plans-dexecution/mysql/operations

    id_bloc 没有出现在 where 和 order by 子句中,为什么我需要在我的多重索引上添加 id_bloc ?

    您不需要这样做,但这样做允许所谓的仅索引扫描(由 Extra 中的“使用索引”字样表示)。您可以在此法语页面了解仅索引扫描:http://use-the-index-luke.com/fr/sql/regrouper-les-donnees/parcours-d-index-couvrants

    【讨论】:

    • 谢谢,我可以优化这个请求吗?我可以避免 rows = 58252 吗? (限制为 0,10)。
    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多