不确定要应用于我的SQL表的索引

时间:2013-10-25 10:53:32

标签: mysql sql indexing

我有一个规范化的数据库结构,我将尝试解释。

3张表:

  • 简档
  • 关键字
  • keyword_profile

我网站上的每个个人资料都可以链接到不同数量的关键字。每个关键字都在关键字表中获得一个ID号。每个配置文件都在配置文件表中获取一个ID号。 keyword_profile表有大约600k行,其中keywordID链接到profileID。

我在配置文件表中的ID列上有一个PRIMARY索引。
我在关键字表格中的ID列上有一个PRIMARY索引 我在关键字表中的关键字名称列上有一个UNIQUE索引 我在keyword_profile表上有一个PRIMARY索引,如下所示:(profile_id,keyword_id)
我在keyword_profile表

中的profile_ID列上有一个索引

下一步:当我执行以下查询时(特定关键字名为'dienst'):

EXPLAIN SELECT profiles.hoofdrubriek, profiles.plaats, profiles.bedrijfsnaam, profiles.gemeente, profiles.bedrijfsslogan, profiles.straatnaam, profiles.huisnummer, profiles.postcode, profiles.telefoonnummer, profiles.fax,profiles.email, profiles.website, profiles.bedrijfslogo
FROM profiles
INNER JOIN profile_dienst ON profiles.ID = profile_dienst.profile_id
INNER JOIN diensten ON profile_dienst.dienst_id = diensten.ID
WHERE (
diensten.dienst = 'Aannemersdiensten'
)
ORDER BY profiles.grade DESC , profiles.bedrijfsnaam

我得到以下结果。它扫描所有600k行!!这不是我希望的结果。我可以应用哪些索引,因此它不会扫描整个表格?

id - select_type - table - type - key - rows - Extra
1 - SIMPLE - diensten - const - dienst - 1 - Using temporary; Using filesort
1 - SIMPLE - profile_dienst - index - PRIMARY - 662000 - Using where; Using index
1 - SIMPLE - profiles - eq_ref - PRIMARY - 1 - Using where

感谢帮助人员!!

编辑:添加了SHOW CREATE TABLE结果:

CREATE TABLE `diensten` (
 `ID` mediumint(9) NOT NULL AUTO_INCREMENT,
 `dienst` varchar(255) NOT NULL,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `dienst` (`dienst`)
) ENGINE=MyISAM AUTO_INCREMENT=1903 DEFAULT CHARSET=utf8


CREATE TABLE `profile_dienst` (
 `profile_id` varchar(20) NOT NULL,
 `dienst_id` varchar(20) NOT NULL,
 PRIMARY KEY (`dienst_id`,`profile_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

CREATE TABLE `profiles` (
 `ID` varchar(255) NOT NULL DEFAULT '',
 `username` varchar(255) DEFAULT NULL,
...more columns...,
     `grade` int(5) NOT NULL,
     PRIMARY KEY (`ID`),
     KEY `IDX_TIMESTAMP` (`timestamp`),
     KEY `IDX_NIEUW` (`nieuw`),
     KEY `IDX_HOOFDRUBRIEK` (`hoofdrubriek`),
     KEY `bedrijfsnaam` (`bedrijfsnaam`),
     KEY `grade` (`grade`),
     KEY `gemeente` (`gemeente`),
     KEY `plaats` (`plaats`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8

2 个答案:

答案 0 :(得分:0)

我认为没关系,它正在扫描profile_dienst的所有值,因为MySql必须查找diensten.ID。好消息是使用和索引。

您可以在此处查看有关MySql解释计划的额外列的更多信息:EXPLAIN Extra Information

答案 1 :(得分:0)

你需要更好地进行规范化..你正在使用mediumint profile_dienst.dienst_id = diensten.ID加入一个varrhar(20),这就是为什么需要一个FULL INDEX SCAN ..这就是Explain列类型:index和Extra: “using index”表示..如果数据类型相同,MySQL只能使用索引

MySQL可以使用索引时使用内部自连接http://sqlfiddle.com/#!2/1ef09/4的小演示..使用INT,SMALLINT,CHAR和VARCHAR数据类型..在这里你可以看到JOIN ON和INT和SMALLINT可以使用索引和JOIN在CHAR和VARCHAR上也..但是将INT与CHAR混合使用MySQL无法使用索引,需要进行全表扫描,请看TYPE:ALL