【发布时间】:2013-12-02 04:46:56
【问题描述】:
我的一个 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
这段查询中的“OR”运算符造成了麻烦:
rubrieken.rubriek = 'Pedicurepraktijken' OR profiles.hoofdrubriek = 'Pedicurepraktijken'
如果我取出上述两行代码之一,我的所有表都应用了索引,这些索引可以正常工作。将它们与 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
当然,我可以使用 UNION DISTICT 解决问题,从而将两个不同的查询结合起来,但我认为这不应该是正确的方法..
【问题讨论】:
-
是否存在性能问题?有时 SQL 不使用索引,因为它不必
-
您使用的是什么数据库? MYSQL?
-
我确实在使用 MYSQL。不使用索引意味着它会扫描大约 600000+ 行,这会使其速度慢得令人讨厌,并且可能会占用太多资源。
-
您是否尝试过使用USE INDEX 提示?我仍然怀疑 UNION 是要走的路。
-
@GarethD,是的,我做到了。没有错误消息,所以提示应该没问题,但仍然没有使用索引。工会会解决问题,但不应该有更清洁的解决方案吗?我在这里失踪的根本原因是什么..