我有两张桌子.我写了一个查询来在一列上加入它们.此列在两个表中都已编制索引,但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 – 索引字段上的连接不使用索引相关推荐

  1. mysql 不执行索引_mysql使用不上索引的几种情况

    索引出现的主要目的是提高查询语句的执行效率.为了能够提高查询语句的性能,我们基本的做法都是在查询条件字段上合理地增加索引来实现的. 不过,你是否碰到过类似的情况,查询的条件字段明明有创建索引,可是My ...

  2. mysql重建索引_mysql创建、删除、重建、删除索引的操作命令的一些总结

    创建索引 索引的创建可以在create table语句中进行,也可以在表创建完成后单独的使用create index或者alter table来给表增加索引.一下语句分别是如何创建主键的索引(prim ...

  3. 覆盖索引与联合索引_Mysql性能优化:为什么要用覆盖索引?

    相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗? 本篇文章将从MYSQL内部 ...

  4. mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?

    前言 大家都知道对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?来验证一下,下面话不多说了,来一起看看详细的介绍吧. 1.新建表effect_ ...

  5. mysql myisam表加索引_MySQL中myisam和innodb的主键索引有什么区别

    ALTER TABLE t1 ADD INDEX(or CREATE INDEX) ALTER TABLE t1 ADD FULLTEXT INDEX ALTER TABLE t1 ADD COLUM ...

  6. mysql text查找性能_MySQL TEXT字段性能

    I now know that TEXT fields are written to disk rather than in memory when queried 仅当查询需要临时表来存储多个排序或 ...

  7. mysql韩语排序_MySQL汉字字段按拼音排序

    我们的MySQL使用latin1的默认字符集,也就是说,对汉字字段直接使用GBK内码的编码进行存储,当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时),默认无法通过order ...

  8. mysql 多主键_MySQL多字段主键

    MySql多字段主键又可以成为复合主键,复合主键也是主键的一种与主键具有相同的功能和定义,所谓的复合主键,就是指表的主键含有一个以上的字段组成 . MySQL多字段主键又可以成为复合主键.复合主键也是 ...

  9. mysql+ubunt+绿色安装_Mysql在ubuntu18上的安装及简单使用

    数据相关行业都离不开数据库,mysql在ubuntu上的安装比在windows上安装简单多了,下面我记录一下自己成功安装的步骤和使用. 1.安装软件 首先更新一下源:sudo apt-get upda ...

最新文章

  1. 2022-2028年中国亲子游行业市场分析及前瞻研究报告
  2. MATLAB 利用plot 画图,加标题,保存图片
  3. 地域和地方的区别_商标、品牌、LOGO,三者区别在哪里?
  4. 为什么不同新旧UPS电池不能混用?浮充电压是什么?
  5. linux编译lua,Linux CentOS 编译LUA。。搞半天终于对了= =
  6. RLE重铸回归方法的荣光后,回归和热图的异同究竟在何方?
  7. 完全相同的4个小矩形如图所示放置_短线投资,遇到“矩形突破”,斩钉截铁满仓干!...
  8. 互联网晚报 | 11月11日 星期四 | 腾讯第三季度营收1424亿元;华为捐赠百万价值职业技能券;货拉拉成立司机权益保障委员会...
  9. 区块链原理设计与应用_我如何设计一个可以在6个月内吸引200K用户的区块链应用...
  10. 使用face-api和Tensorflow.js在浏览器中进行AI年龄估计
  11. 2010年 我的齐鲁软件大赛作品
  12. Make a Crystal UVA - 11014 (容斥定理)
  13. Java网络爬虫实操(6)
  14. Linux串口驱动分析read
  15. 如何理解Stand SPI Dual SPI 和Quad SPI
  16. Control-车辆动力学模型
  17. python量化投资推荐书籍_有没有值得推荐的介绍有名的量化投资策略的书籍?
  18. aop aspectj autoproxy / 的作用
  19. C# Winform控件贴透明png图片遇到的问题
  20. 解题报告Best Time to Buy and Sell Stock with Cooldown

热门文章

  1. 数据分析师—岗位分析(峰池)
  2. iOS学习笔记--图片美白(二)
  3. idea 配置maven及环境变量配置
  4. Nessus的安装和基本使用
  5. 获取计算机进程的基址,Python - 如何获取进程的起始/基址?
  6. ROS环境下的串口通讯
  7. G - 土耳其冰淇凌
  8. svn上传文件时出现 “xxx is already under version control” 报错
  9. SEH结构体异常处理
  10. Nvidia第四季度游戏和AI芯片销售额达到29.1亿美元,较上季度增涨10%