mysql 组合索引

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。

  为了形象地对比两者,再建一个表:

 

CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, 
vc_Name VARCHAR(50) NOT NULL, 
vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, 
PRIMARY KEY (i_testID) );

 

  在这 10000 条记录里面 7 上 8 下地分布了 5 条 vc_Name="erquan" 的记录,只不过 city,age,school 的组合各不相同。

  来看这条T-SQL:

 

SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;

 

  首先考虑建MySQL单列索引:

  在vc_Name列上建立了索引。执行 T-SQL 时,MYSQL 很快将目标锁定在了vc_Name=erquan 的 5 条记录上,取出来放到一中间结果集。在这个结果集里,先排除掉 vc_City 不等于"郑州"的记录,再排除 i_Age 不等于 25 的记录,最后筛选出唯一的符合条件的记录。

  虽然在 vc_Name 上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在 vc_City 和 i_Age 分别建立的MySQL单列索引的效率相似。

  为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。就是将 vc_Name,vc_City,i_Age 建到一个索引里:

 

ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);

 

  建表时,vc_Name 长度为 50,这里为什么用 10 呢?因为一般情况下名字的长度不会超过 10,这样会加速索引查询速度,还会减少索引文件的大小,提高 INSERT 的更新速度。

  执行 T-SQL 时,MySQL 无须扫描任何记录就到找到唯一的记录。

  肯定有人要问了,如果分别在 vc_Name,vc_City,i_Age 上建立单列索引,让该表有 3 个单列索引,查询时和上述的组合索引效率一样吗?大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引。

  建立这样的组合索引,其实是相当于分别建立了

 

vc_Name,vc_City,i_Age vc_Name,vc_City vc_Name

 

  这样的三个组合索引!为什么没有 vc_City,i_Age 等这样的组合索引呢?这是因为 mysql 组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个 T-SQL 会用到:

 

SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"

SELECT * FROM myIndex WHREE vc_Name="erquan"

 

  而下面几个则不会用到:

SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州" 
SELECT * FROM myIndex WHREE vc_City="郑州"

转载于:https://www.cnblogs.com/opps/p/5004816.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmake使用总结(转)---工程主目录CMakeList文件编写

在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大。采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。cmake 根据内置的规则和语法来自动生…

微信开发者工具 wxmi修改模版颜色_十款高效好用的在线网页工具,提升你的办公效率...

大家好, 我是阿毛,今天给大家推荐高效办公的10个在线网页工具,可以不用下载安装很多app,也不用在电脑上装很多软件。在线制作精彩视频操作非常简单,选择模板,上传照片然后点击制作等待完成就可以了&#xf…

三星ml1660拆机图解_三星s6拆机图解介绍

三星s6拆机图解介绍三星s6怎么拆机?不管你是手机维修者还是狂热的手机玩家,相信对您手中的三星s6内部构造和组装步骤应该都是非常有兴趣的吧?今天绿茶通过Fixit发布的三星s6拆机教程来和大家一起分享一下三星s6拆机步骤,从三星s6的内部构造一起来了解一…

Ajax请求利用jsonp实现跨域

跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资源(相同域名和端口,此外域名与对应的ip也算不同源,要么都域名,要么都ip). 以上就是js的跨域问…

[转]使用Navicat for Oracle工具连接oracle的

使用Navicat for Oracle工具连接oracle的 这是一款oracle的客户端的图形化管理和开发工具,对于许多的数据库都有支持。之前用过 Navicat for sqlserver,感觉很好用,所以下载了Oracle版的用。上网查看了一下这个工具可以用于任何版本 8i 或以上的 Oracle …

微信小程序基于第三方插件微信同声传译,以及一些问题解决办法

使用之前首先得在微信微信小程序后台添加插件,获取插件的appid 名称 使用时在app.json文件添加插件配置 1 plugins: { 2 WechatSI: { 3 version: 0.1.0, 4 provider: wx069ba97219f66d99 5 } 6 } 其次就是在使用的页面进行调用 在index.js外…

TF卡里删掉文件后内存没变大_内存卡损坏怎么修复?数据恢复方法教程

内存卡损坏怎么修复?内存卡又叫SD卡,是一种很轻便小巧的便携存储装置,往往内置于各种便携媒体设备内部。内存卡本身具有坚固、抗冲击等外部特性和读写快、空间大等内部特性,但是内存卡因为每天都要读写大量数据很容易从内部发生损…

apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中。使用Apollo存储限流规则Sentinel自身就支持了多种不同的数据源来持久…

Lintcode: Unique Paths

C dp 递推式&#xff1a;dp[i][j] dp[i-1][j] dp[i][j-1] 初值&#xff1a;dp[i][j] 1&#xff0c;i0 or j0 空间优化&#xff1a;省掉一维 1 class Solution {2 public:3 /**4 * param n, m: positive integer (1 < n ,m < 100)5 * return an integer6…

idea 如何隐藏/展示不想看到的文件

隐藏&#xff1a;在 Ignore files and folders中添加想要过滤的文件或文件夹名称 展示隐藏文件&#xff1a; 在过滤列表中删除掉文件或者文件夹就好了 转载于:https://www.cnblogs.com/mengjianzhou/p/6177897.html

BZOJ2286: [Sdoi2011]消耗战(虚树)

BZOJ2286: [Sdoi2011]消耗战 Time Limit: 20 Sec   Memory Limit: 512 MB Description 在一场战争中&#xff0c;战场由n个岛屿和n-1个桥梁组成&#xff0c;保证每两个岛屿间有且仅有一条路径可达。现在&#xff0c;我军已经侦查到敌军的总部在编号为1的岛屿&#xff0c;而且…

Java基础知识:Java实现Map集合二级联动4

comboBox.setModel(new DefaultComboBoxModel(getProvince())); // 添加省份信息 final JLabel label new JLabel(); label.setText("省/直辖市"); label.setBounds(155, 30, 66, 18); panel.add(label); final JLabel label_1 new JLabel(); label_1.setText(&quo…

linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集

一、前言数据源是组态软件的核心灵魂&#xff0c;少了数据源&#xff0c;组态就是个花架子没卵用&#xff0c;一般数据源有三种方式获取&#xff0c;串口、网络、数据库&#xff0c;至于数据规则是什么&#xff0c;这个用户自己指定&#xff0c;本设计器全部采用第一个字节作为…

magento2邮件调试方法

order mail 直接打印到页面上 位置 vendor\magento\module-sales\Model\Order\Email\Sender.php Magento\Sales\Model\Order\Email\Sender::prepareTemplate() 添加代码 $objectManager \Magento\Framework\App\ObjectManager::getInstance(); $templateFactory $objectManag…

python多进程怎么样_Python执行多进程任务的方法

Python的多进程可以借助from multiprocessing import Pool来实现。简而言之分为这样几步&#xff1a;导入包from multiprocessing import Pool编写任务函数。def 任务函数(参数)实例化进程池并设置进程数。poolPool(欲设置的进程数)开始布置任务&#xff0c;把多个任务添加进多…

JAVA多线程之Synchronize 关键字原理

image众所周知 Synchronize 关键字是解决并发问题常用解决方案&#xff0c;有以下三种使用方式: 同步普通方法&#xff0c;锁的是当前对象。同步静态方法&#xff0c;锁的是当前 Class 对象。同步块&#xff0c;锁的是 {} 中的对象。实现原理&#xff1a;JVM 是通过进入、退出对…

iOS-数据持久化-第三方框架FMDB的使用

FMDB简单介绍 一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象&#xff0c;省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架&#xff0c;更加轻量级和灵活 提供了多线程安全…

电脑word文档打不开怎么办_word怎么转pdf?两个值得学习的高效转换法

word怎么转pdf&#xff1f;两个值得学习的高效转换法word怎么转pdf&#xff1f;pdf格式是我们经常能够使用到的格式&#xff0c;因为pdf格式在传递的过程中能更好地避免文件出现乱码打不开或误触导致文件被修改的情况。那如果想要把word文件转换成pdf格式以避免阅读word时文件被…

sql server常用函数、常用语句

一、常用函数 1.字符串函数 &#xff1a; charindex(:,abc:123) --寻找一个字符在一段字符串中起始的位置 len(zhangsan) --获取一段字符串的长度 left(Ly,君子之耀,2) --从一段字符串左边返回指定长度的字符 right(char_expr,int_expr) --返回字符串右边int_expr个字符 …

python 矩阵乘法 跳过nan_python – Numpy:当一些向量元素等于零时,矩阵向量乘法不会跳过计算吗?...

我最近一直致力于一个项目,其中我的大部分时间花费在密集矩阵A和稀疏向量v上(见here).在我尝试减少计算时,我注意到A.dot(v)的运行时间不受v的零条目数的影响.为了解释为什么我希望在这种情况下改进运行时,让result A.dot.v使得j 1的结果[j] sum_i(A [i,j] * v [j])… v.sha…