mysql - SQL查询没有正确使用索引

标签 mysql sql join indexing

我的一个 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

这部分查询中的“或”运算符导致了问题:

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 解决问题,从而结合两个不同的查询,但我认为这不应该是解决问题的方法..

最佳答案

好吧,如果 导致问题,那么最简单的解决方案是将查询分成两部分并使用 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;

我将 grade 添加到 select 子句中,以便它可以被 order by 使用。

关于mysql - SQL查询没有正确使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057884/

相关文章:

php - 将wordpress表单输入sql

mysql - 使用 Power Query 将 MySQL 查询导入 Microsoft Excel

ruby-on-rails - 如何在多态连接表上强制唯一性?

mysql - 左外连接到生成的表?

sql - 在状态字段中获取空值,任何人都可以解释我在做什么错吗?

mysql - 编写 Select 查询以从一个表中扣除另一个表

mysql - 如何编写选择查询和 IF 条件来代替 mysql 查询中的列名

php - 什么是与 CodeIgniter 一起使用的好的博客系统?

php - 向 Mysql 数据库发送两个查询时出现问题

sql - exec 失败,因为名称不是有效的标识符?