gpt4 book ai didi

mysql - 不确定要对我的 SQL 表应用什么索引

转载 作者:行者123 更新时间:2023-11-29 03:37:18 24 4
gpt4 key购买 nike

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

3 个表:

  • 简介
  • 关键字
  • 关键字配置文件

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

我在配置文件表中的 ID 列上有一个 PRIMARY 索引。
我在关键字表中的 ID 列上有一个 PRIMARY 索引。
我在关键字表中的关键字名称列上有一个 UNIQUE 索引。
我在 keyword_profile 表上有一个主索引,如下所示:(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

最佳答案

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

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

关于mysql - 不确定要对我的 SQL 表应用什么索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com