mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引
我有两张桌子.我写了一个查询来在一列上加入它们.此列在两个表中都已编制索引,但MySQL未使用索引.有人a)告诉我为什么和b)告诉我如何让MySQL使用索引快速加入这些表.
第一张表:
CREATE TABLE `dol_msa_zip_assoc` (
`pkey` int(5) unsigned NOT NULL AUTO_INCREMENT,
`zip` varchar(5) NOT NULL DEFAULT '',
`pmsa_msa` varchar(5) NOT NULL DEFAULT '',
PRIMARY KEY (`pkey`),
KEY `zip` (`zip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
它包含42690条记录.
另一张桌子:
CREATE TABLE `v3_msa_zip_assoc` (
`pkey` int(5) unsigned NOT NULL AUTO_INCREMENT,
`zip` varchar(9) NOT NULL DEFAULT '',
`pmsa_msa` varchar(6) NOT NULL DEFAULT '',
PRIMARY KEY (`pkey`),
KEY `zip` (`zip`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
它包含42486条记录.
我的查询,旨在查找第一个表中不在第二个表中的记录:
SELECT d.*, o.* FROM `dol_msa_zip_assoc` d
LEFT JOIN `v3_msa_zip_assoc` o
ON o.zip = d.zip
WHERE o.zip IS NULL
当我解释此查询时,我看到zip列上的索引未被使用:
+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------------------------+
| 1 | SIMPLE | d | ALL | NULL | NULL | NULL | NULL | 42915 | NULL |
| 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 42486 | Using where; Not exists; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------------------------+
导致此失败的原因可能是什么?是因为一个zip列是latin1而另一个是utf8?如何使用此查询来使用索引,以便它不需要运行年龄?
编辑:反转JOIN的顺序显然确实利用了索引:
SELECT d . * , o . *
FROM `v3_msa_zip_assoc` o
LEFT JOIN `dol_msa_zip_assoc` d ON d.zip = o.zip
WHERE d.zip IS NULL
这是解释:
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+
| 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 42486 | NULL |
| 1 | SIMPLE | d | ref | zip | zip | 17 | func | 1 | Using where; Not exists |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+
编辑2:我已经改变旧表的结构以使用utf8排序规则.现在定义如下:
CREATE TABLE `v3_msa_zip_assoc` (
`pkey` int(5) unsigned NOT NULL AUTO_INCREMENT,
`zip` varchar(9) NOT NULL DEFAULT '',
`pmsa_msa` varchar(6) NOT NULL DEFAULT '',
PRIMARY KEY (`pkey`),
KEY `zip` (`zip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这似乎解决了这个问题:
mysql> EXPLAIN SELECT d . * , o . *
-> FROM `dol_msa_zip_assoc` d
-> LEFT JOIN `v3_msa_zip_assoc` o ON o.zip = d.zip
-> WHERE o.zip IS NULL;
+----+-------------+-------+------+---------------+------+---------+---------------------+-------+-------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+---------------------+-------+-------------------------+
| 1 | SIMPLE | d | ALL | NULL | NULL | NULL | NULL | 42915 | NULL |
| 1 | SIMPLE | o | ref | zip | zip | 29 | myplan_v4_dev.d.zip | 1 | Using where; Not exists |
+----+-------------+-------+------+---------------+------+---------+---------------------+-------+-------------------------+
mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引相关推荐
- mysql 不执行索引_mysql使用不上索引的几种情况
索引出现的主要目的是提高查询语句的执行效率.为了能够提高查询语句的性能,我们基本的做法都是在查询条件字段上合理地增加索引来实现的. 不过,你是否碰到过类似的情况,查询的条件字段明明有创建索引,可是My ...
- mysql重建索引_mysql创建、删除、重建、删除索引的操作命令的一些总结
创建索引 索引的创建可以在create table语句中进行,也可以在表创建完成后单独的使用create index或者alter table来给表增加索引.一下语句分别是如何创建主键的索引(prim ...
- 覆盖索引与联合索引_Mysql性能优化:为什么要用覆盖索引?
相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗? 本篇文章将从MYSQL内部 ...
- mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?
前言 大家都知道对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?来验证一下,下面话不多说了,来一起看看详细的介绍吧. 1.新建表effect_ ...
- mysql myisam表加索引_MySQL中myisam和innodb的主键索引有什么区别
ALTER TABLE t1 ADD INDEX(or CREATE INDEX) ALTER TABLE t1 ADD FULLTEXT INDEX ALTER TABLE t1 ADD COLUM ...
- mysql text查找性能_MySQL TEXT字段性能
I now know that TEXT fields are written to disk rather than in memory when queried 仅当查询需要临时表来存储多个排序或 ...
- mysql韩语排序_MySQL汉字字段按拼音排序
我们的MySQL使用latin1的默认字符集,也就是说,对汉字字段直接使用GBK内码的编码进行存储,当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时),默认无法通过order ...
- mysql 多主键_MySQL多字段主键
MySql多字段主键又可以成为复合主键,复合主键也是主键的一种与主键具有相同的功能和定义,所谓的复合主键,就是指表的主键含有一个以上的字段组成 . MySQL多字段主键又可以成为复合主键.复合主键也是 ...
- mysql+ubunt+绿色安装_Mysql在ubuntu18上的安装及简单使用
数据相关行业都离不开数据库,mysql在ubuntu上的安装比在windows上安装简单多了,下面我记录一下自己成功安装的步骤和使用. 1.安装软件 首先更新一下源:sudo apt-get upda ...
最新文章
- 2022-2028年中国亲子游行业市场分析及前瞻研究报告
- MATLAB 利用plot 画图,加标题,保存图片
- 地域和地方的区别_商标、品牌、LOGO,三者区别在哪里?
- 为什么不同新旧UPS电池不能混用?浮充电压是什么?
- linux编译lua,Linux CentOS 编译LUA。。搞半天终于对了= =
- RLE重铸回归方法的荣光后,回归和热图的异同究竟在何方?
- 完全相同的4个小矩形如图所示放置_短线投资,遇到“矩形突破”,斩钉截铁满仓干!...
- 互联网晚报 | 11月11日 星期四 | 腾讯第三季度营收1424亿元;华为捐赠百万价值职业技能券;货拉拉成立司机权益保障委员会...
- 区块链原理设计与应用_我如何设计一个可以在6个月内吸引200K用户的区块链应用...
- 使用face-api和Tensorflow.js在浏览器中进行AI年龄估计
- 2010年 我的齐鲁软件大赛作品
- Make a Crystal UVA - 11014 (容斥定理)
- Java网络爬虫实操(6)
- Linux串口驱动分析read
- 如何理解Stand SPI Dual SPI 和Quad SPI
- Control-车辆动力学模型
- python量化投资推荐书籍_有没有值得推荐的介绍有名的量化投资策略的书籍?
- aop aspectj autoproxy / 的作用
- C# Winform控件贴透明png图片遇到的问题
- 解题报告Best Time to Buy and Sell Stock with Cooldown