use*_*687 5 mysql sql indexing join
我的一个SQL查询有问题.这是我的查询:
explain
SELECT DISTINCT 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
LEFT JOIN profile_subrubriek ON profiles.ID=profile_subrubriek.profile_id
LEFT JOIN rubrieken ON profile_subrubriek.subrubriek_id=rubrieken.ID
WHERE (
rubrieken.rubriek = 'Pedicurepraktijken' OR
profiles.hoofdrubriek = 'Pedicurepraktijken'
)
ORDER BY profiles.grade DESC, profiles.bedrijfsnaam
Run Code Online (Sandbox Code Playgroud)
这段查询中的"OR"运算符会导致麻烦:
rubrieken.rubriek = 'Pedicurepraktijken' OR profiles.hoofdrubriek = 'Pedicurepraktijken'
Run Code Online (Sandbox Code Playgroud)
我已经在我的所有表上应用了索引,如果我取出上面两行代码中的一行,它就能正常运行.将它们与OR运算符组合会导致它崩溃并拒绝使用我在配置文件表中的'hoofdrubriek'列上应用的索引.在我的相关表格的布局下面:
CREATE TABLE `profiles` (
`ID` varchar(255) NOT NULL DEFAULT '',
......
`hoofdrubriek` varchar(255) DEFAULT NULL,
...
`timestamp` datetime DEFAULT NULL,
`meerderevestigingen` varchar(255) NOT NULL,
`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
CREATE TABLE `rubrieken` (
`ID` mediumint(9) NOT NULL AUTO_INCREMENT,
`rubriek` varchar(255) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `rubriek` (`rubriek`)
) ENGINE=MyISAM AUTO_INCREMENT=1905 DEFAULT CHARSET=utf8
CREATE TABLE `profile_subrubriek` (
`profile_id` varchar(20) NOT NULL,
`subrubriek_id` mediumint(9) NOT NULL,
PRIMARY KEY (`subrubriek_id`,`profile_id`),
KEY `profile_id` (`profile_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
当然我可以用UNION DISTICT来解决这个问题,从而结合了两个不同的查询,但我不认为这应该是要走的路.
好吧,如果or
导致了问题,那么最简单的解决方案是将查询分成两部分,然后使用union
(在您的情况下,因为distinct
)将它们组合在一起。使用索引纠正该where
子句可能是不可能的,因为它引用了两个不同的列:
SELECT p.hoofdrubriek, p.plaats, p.bedrijfsnaam, p.gemeente, p.bedrijfsslogan, profiles.straatnaam,
p.huisnummer, profiles.postcode, p.telefoonnummer, p.fax, p.email, p.website, p.bedrijfslogo,
p.grade
FROM profiles p
LEFT JOIN profile_subrubriek ON p.ID=profile_subrubriek.profile_id
LEFT JOIN rubrieken ON profile_subrubriek.subrubriek_id=rubrieken.ID
WHERE rubrieken.rubriek = 'Pedicurepraktijken'
union
SELECT p.hoofdrubriek, p.plaats, p.bedrijfsnaam, p.gemeente, p.bedrijfsslogan, profiles.straatnaam,
p.huisnummer, profiles.postcode, p.telefoonnummer, p.fax, p.email, p.website, p.bedrijfslogo,
p.grade
FROM profiles p
LEFT JOIN profile_subrubriek ON p.ID=profile_subrubriek.profile_id
LEFT JOIN rubrieken ON profile_subrubriek.subrubriek_id=rubrieken.ID
WHERE p.hoofdrubriek = 'Pedicurepraktijken'
ORDER BY grade DESC, bedrijfsnaam;
Run Code Online (Sandbox Code Playgroud)
我添加grade
到该select
子句中,以便它可以被order by
.