当前位置: 首页 > 编程日记 > 正文

单列索引和复合索引的使用

表结构:

mysql> desc car;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(3)      | NO   | PRI | NULL    | auto_increment |
| brand    | varchar(16) | YES  | MUL | NULL    |                |
| name     | varchar(30) | YES  | MUL | NULL    |                |
| emission | varchar(6)  | YES  | MUL | NULL    |                |
| country  | varchar(4)  | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

索引:

mysql> show index from car;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| car   |          0 | PRIMARY     |            1 | id          | A         |          39 |     NULL | NULL   |      | BTREE      |         |               |
| car   |          1 | IX_brand    |            1 | brand       | A         |           4 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_name     |            1 | name        | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_emission |            1 | emission    | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

三个字段的单列索引。

数据:

mysql> SELECT * FROM car;
+----+--------+-----------+----------+---------+
| id | brand  | name      | emission | country |
+----+--------+-----------+----------+---------+
|  1 | 大众   | 捷达      | 1.6L     | 德系    |
|  2 | 大众   | 桑塔纳    | 1.6L     | 德系    |
|  3 | 大众   | 桑塔纳    | 1.8L     | 德系    |
|  4 | 大众   | 桑塔纳    | 2.0L     | 德系    |
|  5 | 斯柯达 | 晶锐      | 1.6L     | 德系    |
|  6 | 斯柯达 | 晶锐      | 1.4L     | 德系    |
|  7 | 大众   | POLO      | 1.4L     | 德系    |
|  8 | 大众   | POLO      | 1.6L     | 德系    |
|  9 | 大众   | 新宝来    | 1.L      | 德系    |
| 10 | 大众   | 新宝来    | 1.6L     | 德系    |
| 11 | 大众   | 新宝来    | 1.4TSI   | 德系    |
| 12 | 大众   | 新速腾    | 1.4TSI   | 德系    |
| 13 | 大众   | 新速腾    | 1.6L     | 德系    |
| 14 | 大众   | 新速腾    | 1.8TSI   | 德系    |
| 15 | 大众   | 高尔夫GTI | 2.0TSI   | 德系    |
| 16 | 大众   | 高尔夫    | 1.6L     | 德系    |
| 17 | 大众   | 高尔夫    | 1.4TSI   | 德系    |
| 18 | 大众   | 朗逸      | 1.6L     | 德系    |
| 19 | 大众   | 朗逸      | 2.0L     | 德系    |
| 20 | 大众   | 朗逸      | 1.4TSI   | 德系    |
| 21 | 大众   | 帕萨特    | 1.8TSI   | 德系    |
| 22 | 大众   | 帕萨特    | 2.0L     | 德系    |
| 23 | 大众   | 帕萨特    | 2.8L     | 德系    |
| 24 | 大众   | 迈腾      | 1.8TSI   | 德系    |
| 25 | 大众   | 迈腾      | 1.4TSI   | 德系    |
| 26 | 大众   | 迈腾      | 2.0TSI   | 德系    |
| 27 | 斯柯达 | 明锐      | 2.0L     | 德系    |
| 28 | 斯柯达 | 明锐      | 1.6L     | 德系    |
| 29 | 斯柯达 | 明锐      | 1.4TSI   | 德系    |
| 30 | 斯柯达 | 明锐      | 1.8TSI   | 德系    |
| 31 | 大众   | 途观      | 1.8TSI   | 德系    |
| 32 | 大众   | 途观      | 1.4TSI   | 德系    |
| 33 | 大众   | 途观      | 2.0TSI   | 德系    |
| 34 | 斯柯达 | 昊锐      | 1.8TSI   | 德系    |
| 35 | 斯柯达 | 昊锐      | 2.0TSI   | 德系    |
| 36 | 斯柯达 | 昊锐      | 1.4TSI   | 德系    |
| 37 | 大众   | 辉腾      | 3.6L     | 德系    |
| 38 | 大众   | 辉腾      | 4.2L     | 德系    |
| 39 | 大众   | 辉腾      | 6.0L     | 德系    |
+----+--------+-----------+----------+---------+
39 rows in set (0.00 sec)

====================================================================

测试1:

mysql> explain SELECT * FROM car WHERE brand='大众' AND NAME='新速腾' ORDER BY emission DESC;
+----+-------------+-------+------+------------------+---------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys    | key     | key_len | ref   | rows | Extra                       |
+----+-------------+-------+------+------------------+---------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | car   | ref  | IX_brand,IX_name | IX_name | 63      | const |    3 | Using where; Using filesort |
+----+-------------+-------+------+------------------+---------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

虽然存在3个索引,但MYSQL只能使用一个索引,那个它认为最有效率的。

mysql> SELECT * FROM car WHERE brand='大众' AND NAME='新速腾' ORDER BY emission DESC;        
+----+-------+--------+----------+---------+
| id | brand | name   | emission | country |
+----+-------+--------+----------+---------+
| 14 | 大众  | 新速腾 | 1.8TSI   | 德系    |
| 13 | 大众  | 新速腾 | 1.6L     | 德系    |
| 12 | 大众  | 新速腾 | 1.4TSI   | 德系    |
+----+-------+--------+----------+---------+
3 rows in set (0.00 sec)

====================================================================

测试2:

复合索引(brand,name,emission)

mysql> show index from car;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| car   |          0 | PRIMARY  |            1 | id          | A         |          39 |     NULL | NULL   |      | BTREE      |         |               |
| car   |          1 | IX_b_n_e |            1 | brand       | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_b_n_e |            2 | name        | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_b_n_e |            3 | emission    | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

mysql> explain SELECT * FROM car WHERE brand='大众' AND NAME='新速腾' ORDER BY emission DESC;
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref         | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 98      | const,const |    3 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

用上索引。

====================================================================

测试3:

mysql> explain SELECT * FROM car WHERE NAME='新速腾' ORDER BY emission DESC;                        
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                       |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | car   | ALL  | NULL          | NULL | NULL    | NULL |   39 | Using where; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
1 row in set (0.00 sec)

如果复合索引第一个字段没有用上,那么就不会使用到索引。

====================================================================

测试4:name和brand字段互换位置

mysql> explain SELECT * FROM car WHERE NAME='新速腾' and brand='大众' ORDER BY emission DESC;        
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref         | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 98      | const,const |    3 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

虽然字段的顺序和索引不一致,但因为在过滤条件上使用了3个索引的字段,索引还是可以用上索引。

====================================================================

测试5:

mysql> explain SELECT * FROM car WHERE brand='斯柯达' ORDER BY emission;
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra                       |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 35      | const |    9 | Using where; Using filesort |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

字段的顺序和索引不一致,不能用到索引。因为只使用了2个索引的字段。

改成字段的顺序和索引的顺序一致,就可以用到索引了。

mysql> explain SELECT * FROM car WHERE brand='斯柯达' ORDER BY name;                 
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 35      | const |    9 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

====================================================================

测试6:

mysql> explain SELECT * FROM car WHERE brand='大众' and name > '' ORDER BY emission DESC;
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                       |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | car   | ALL  | IX_b_n_e      | NULL | NULL    | NULL |   39 | Using where; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
1 row in set (0.00 sec)

虽然是复合索引,虽然字段的顺序和索引的顺序一致,但name > '',检索的记录要大约实际表记录的20%,那么优化器就不会用到索引,而是全部扫描。


本文转自 liang3391 51CTO博客,原文链接:http://blog.51cto.com/liang3391/830622

相关文章:

java学习1

工作了很久,以前学的技术都差不多忘了,为了不荒废技术,现在开始起学习java,并将学习中遇到的问题加以记录。问题1、Exception in thread "main" java.lang.NoClassDefFoundError解决方法:这类问题导致的可能…

ICLR 2019高分论文抢先看,谁是第一?

作者 | 非主流出品 | AI科技大本营 ICLR 2019 将于明年的 5 月 6-9 日在美国路易斯安那州的新奥尔良市举行。本届大会共收到近 1600 篇投稿,相比 ICLR 2018 的 935 篇,以及 ICLR 2017 的 490 篇,几乎每年都在翻番。此前,ICLR 一直…

招行java开发面试,面经:Java后台开发-招行网络科技

一面:留学党的惯性凌晨面试1内容:自我介绍Final关键字数据库(mysql/oracle二选一)数据库调优脏幻不可重复读(mybatis/radis二选一)基本操作(批量插入/如何保证一致性)几种创建新对象方法我成功引导向了反射的诸多应用TCP/UDP老生常谈的区别和三挥四握问题…

puppet相关问题统计

1、 notice: Run of Puppet configuration client already in progress; skipping 解决方法: 部分情况下puppet服务会无法启动,且会提示puppet已经启动,这个时候需要删除一个文件。 rm /var/lib/puppet/state/puppetdlock …

WebForm中DataGrid的20篇经典文章

1、DataGrid动态模板列更新数据并且分页的例子 http://www.cnblogs.com/lovecherry/archive/2005/03/26/126102.html 2、DataGrid动态添加模板列的一个例子 http://www.cnblogs.com/lovecherry/archive/2005/03/25/125526.html 3、DataGrid实现增删(带提示&#xff…

Kotlin基本语法和使用

Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性。 Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于 Android开发者&#…

java注解返回不同消息,Spring MVC Controller中的一个读入和返回都是JSON的方法如何获取javax.validation注解的异常信息...

Spring MVC Controller中的一个读入和返回都是JSON的方法怎么获取javax.validation注解的错误信息?本帖最后由 LonelyCoder2012 于 2014-03-14 03:16:27 编辑标题可能有点绕,看代码就明白了:这是我的User类:import org.hibernate.…

三摄正普及,四摄在路上?谷歌逆天AI算法,只做单摄虚化

作者| 琥珀出品| AI科技大本营想要提高拍照效果,想必对于多数手机厂商而言,给手机塞进更多的摄像头似乎成了当前主流做法,例如“普通摄像头景深摄像头”、“黑白彩色摄像头”、“广角长焦摄像头”……不过,偏偏有这么一家企业反其…

TBContact -- 导出ThunderBird邮件地址本

我写的一个导出ThunderBird邮件地址本的小工具,使用了多线程。其功能有:1 自动检测系统是否装有ThunderBird,并列出所有的地址本文件*.mab。2 可以手工指定一个或多个地址本文件。3 自动检测每个地址本文件里的联系人个数。4 导出每个地址本文…

Linux基础知识入门测试

记录于51CTO的测试题: 第 1 题 Linux中,默认的管理员帐户名称是 A. Administrator B. Admin C. root D. user 第 2 题 在Linux中,如果在文本模式下,可以通过下述的方法进入x window A. 执行startx B. 执行start …

jsp mysql 图片路径,请教JSP中怎么向MySql中存入和取出图片

当前位置:我的异常网 Java Web开发 请教JSP中怎么向MySql中存入和取出图片请教JSP中怎么向MySql中存入和取出图片www.myexceptions.net 网友分享于:2015-08-27 浏览:138次请问JSP中如何向MySql中存入和取出图片?1 直接把图片存入数据库2 把图片的…

开源 | IBM、哈佛共同研发:Seq2Seq模型可视化工具

作者 | Ben Dickson译者 | 刘旭坤编辑 | Jane出品 | AI科技大本营近年来随着深度学习和神经网络技术的发展,机器翻译也取得了长足的进步。神经网络结构越来越复杂,但我们始终无法解释内部发生了什么,“黑箱问题”一直困扰着我们。我们不清楚程…

h3c l2tp ***配置

远程用户-------internet-------F100 采用l2tp方式sysname XXXX //设备名称#l2tp enable //开启l2tp功能 #firewall packet-filter enablefirewall packet-filter default permit#undo connection-limit enableconnection-limit default den…

Blockchain与Big Data将碰撞出怎样的火花?

区块链技术热潮席卷全球,正在与各种新兴技术深入融合——大数据也不例外,卓有远见的企业已将区块链作为未来发展重点。数据开放的大势下,如何保护隐私与安全是大数据领域的难点与挑战。凭借可信与安全的特性,区块链令越来越多高价…

机器学习之开源库

机器学习库(1)scikit-learn [http://scikit-learn.org/] Python下做机器学习,首推scikit-learn。该项目文档齐全、讲解清晰,功能齐备,使用方便,而且社区活跃。 (2)Orange …

arduino跑python,尝试在我的Arduino和stu上执行Python3.7.2中的代码

提前谢谢你。在我会尽量简短。在我有一个ArduinoIDE,有一个串行端口,工作正常。我下载了python3.7.2、PySerial和VPython。全部安装完毕。在通过我的MacBook终端安装了PySerial。sudo easy_install pyserialPassword: Searching for pyserialBest match:…

揭开Windows XP 系统安全模式的密秘

经常使用电脑的人可能都听说过,当电脑出了故障时,Windows会提供一个名为“安全模式”的平台,在这里用户能解决很多问题--不管是硬件(驱动)还是软件的。然而你会使用这个安全模式么?今天我们就来带您认识一下…

matlab文档型数据导入,MATLAB-数据导入

MATLAB-数据导入在MATLAB中导入数据意味着从外部文件加载数据。 importdata函数允许加载不同格式的各种数据文件。它具有以下五种形式-Sr.No.Function & Description1A importdata(filename)Loads data into array A from the file denoted by filename.2A importdata(‘…

专访百度熊辉:有人转AI纯粹因为好找工作,这样的人不是我想要的

2018 年初,学术界的明星人物,美国罗格斯-新泽西州立大学教授、ACM 杰出科学家、长江学者熊辉加盟百度,担任百度商业智能实验室主任以及百度人才智库主任。 从计算机博士到商学院教授,再从学术圈到工业界,熊…

活下去,是一种信念 !

2008年5月12日14:28分以来,读着不想看到的文字和数据,看着不愿看见的图片和画面,已经成了我的主要生活内容。即便是艰难收拾好心情坐在电脑前的此刻,耳边回响的依然是那种撕心裂肺的痛哭和感天动地的呼喊,眼前浮现的依…

我的一个rsync的包装

我完成了一个基于rsync的文件同步方案,其实有人会问,直接用rsync命令不就可以了吗?其实不然,直接用这个命 令的话只能保证得到了同步的效果,审计信息得不到,然而审计信息很重要,比如哪个时间同步…

2018最后一战:25天编程PK赛!

作者 | Jane出品 | AI科技大本营2018 年余额已不足一个月!是惊喜还是惊恐?这一年是充实有意义的一年,还是觉得略有失望?最后这三十天,我们还能学些什么?获得哪些成长?如何为 2019 年准备一个好的…

java 获取已有字体,java获取本机全部可用字体

java获取本机所有可用字体//just for fun,那个28个字母的函数满满都是恶心import java.awt.GraphicsEnvironment ;class Tester{public static void main(String args[]){GraphicsEnvironment ge GraphicsEnvironment.getLocalGraphicsEnvironment();String forName[] ge.get…

mount --bind

mount --bind 能够镜像的把目录挂载到其他路径下mount --bind //此命令可以把目录挂载到其他目录,有镜像功能,会占用两份同样大小的空间,当你umount的时候,所作的镜像会立马消失. $ls ftp tools $cd ftp $mkdir /home/ftp/tools $cd tools $pwd /home/ftp/tools $mount --bin…

Javascript URL编码方法的比较

javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent()。这几种编码所起的作用各不相同。 escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊…

前端、云与人工智能的碰撞 | GDG广州

活动介绍 随着Google TensorFlow的开源升级、前端技术以及云计算的不断发展更迭,企业和开发者都需要与时俱进,才能不被时代大潮给淘汰。本次GDG沙龙旨在通过多个专题演讲为开发者们分享技术进步和业务经验,聚焦前端技术、人工智能以及云计算…

java三维滑雪,第六章 三维数据空间分析方法.ppt

第六章 三维数据空间分析方法* * * * 可视性分析 * * 自然邻域法插值 基本思路: 利用输入点及邻近栅格单元进行插值生成栅格表面。 方法: 利用输入数据点(样本点)为节点,建立Delaunay三角形; 样本点的邻域为其周边相邻多边形形成的凸集中最小…

求教关于NFS服务器的防火墙的设置

我都研究了两个星期的NFS的防火墙了呀,开了rpcinfo -p 显示的所有端口,有hosts,hosts.allow,hosts.deny下的文件也设置了过了呀,可是我开了防火墙,NFS服务器的客户端和和服务器都无法工作呀,那位好心人帮我下呀,最好是有做的这方面的实例的高手呀,共享下你的成功经验呀转载于:h…

退信之550 5.7.1 Unable to relay for *@*.com

"550 5.7.1 Unable to relay for **.com"是常见的退信之一,今天我们就看看导致这个退信的真实原因,以及在mdaemon邮件服务器中遇到这个问题如何解决。接下来,我们看看来自真实环境退信截图。 退信分析:这是一封sh.com域…

“叽里呱啦”说英语,这家公司要用AI增值语言输出能力

11 月 29 日,在线英语启蒙教育品牌叽里呱啦在北京召开“让天赋发声”品牌发布会。叽里呱啦联合创始人兼 CEO 谢尚毅首次对外公开品牌战略,围绕内容、教研、科技三大教育内核,打造教育 IP,积蓄产品力,搭建英语启蒙教育的…