使用连接查询索引 MySQL

Posted

技术标签:

【中文标题】使用连接查询索引 MySQL【英文标题】:Indexing with join queries MySQL 【发布时间】:2021-12-20 09:34:36 【问题描述】:

我对 SQL 还很陌生,我正在尝试了解索引。可以的话请帮忙!

我正在使用 mysql 8.0 以及对这些表的连接查询和索引。我有两张表 charitable 和 Metro,有超过 150 万条记录和 7000 条记录,我正在尝试对其进行索引和应用连接。

注意:我已经有了这两个表的主键。

create table charitable (
EIN bigint primary key not null,
NAME Varchar(255) not null,
ICO varchar(255) null,
STREET varchar(255) not null,
CITY varchar(255) not null,
STATE varchar(255) not null,
ZIP varchar(255) not null, 
GROUP_NO int not null,
SUBSECTION Int not null,
AFFILIATION Int not null,
CLASSIFICATION Int not null,
RULING int not null,
DEDUCTIBILITY Int not null,
FOUNDATION Int not null,
ACTIVITY bigint not null,
ORGANIZATION Int not null,
STATUS Int not null,
TAX_PERIOD varchar(255) null,
ASSET_CD Int not null,
INCOME_CD int not null,
FILING_REQ_CD int not null,
PF_FILING_REQ_CD int not null,
ACCT_PD int not null,
ASSET_AMT varchar(255) null,
INCOME_AMT varchar(255) null,
REVENUE_AMT varchar(255) null,
NTEE_CD varchar(255) null,
SORT_NAME varchar(255) null
);`

create table Metro(
City varchar(255) not null,
State varchar(255) not null,
MMSA varchar(255) null,
MMSA_type varchar(255) null,
CBSA varchar(255) null,
city_St varchar(255) not null,
metro_city varchar(255) null,
primary key (City, State)
);

这是查询。

select co.name, mc.Metro from charitable as co
join Metro as mc
on co.city=mc.city and co.state = mc.state;

因此,我在 Metro(state,city) 上应用了唯一索引,并在恰好在 Join 语句中使用的 charitable(state) 上应用了简单索引。

此索引有助于将提取性能从 18.047 秒降低到 17.85 秒。但是,我不明白 索引如何处理来自慈善机构的重复值。例如,charitable 表有超过 5000 条(州、市)组合的重复记录。而且,第二个疑问是索引如何与连接查询一起工作?

感谢您的帮助!

【问题讨论】:

EXPLAIN query 显示了在哪里做出的决定。 charitable 上的 city,state 二级索引会有所帮助。在创建该索引之前和之后检查 EXPLAIN。 How MySQL (8.0) uses indexes 上的官方文档。 【参考方案1】:

可能 Metro 的 PRIMARY KEY(City, State) 将用于 JOIN。为charitable 添加INDEX(city, state, name) 可能有助于“覆盖”。

使用合理的值,而不是盲目地使用 255。

不要使用VARCHAR 表示金额;算术和比较不能很好地工作。

由于您正在获取 150 万行,因此您不应该期望它非常快。

如果这不是完整的SELECT,那么这不是完整的答案。

【讨论】:

以上是关于使用连接查询索引 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

阿里四面:为何MySQL没有使用建立的索引?

优化 MySQL 连接查询以删除 Using temporary 并使用索引?

MySQL 索引优化与子查询与左连接

MySQL数据库学习笔记----MySQL多表查询之外键表连接子查询索引

为啥 MySQL 中的这个查询不使用索引?

Mysql常用sql脚本与配置管理(密码忘记,角色管理,分表,连接数,高并发,索引,级联查询)