发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引【推荐阅读:对mysql使用索引的误解

MySQL单列索引和组合索引(联合索引)的区别详解
初始我写这篇文章的原因在于面试到一家大的游戏公司的时候,一个面试题
大致的内容是怎么加速这个where a=’1′ 和 where a=’1′ and b=’2′,当时我答题的时候回答的是a加索引,a和b加联合索引。
面试官跟我聊题目的时候说 where a=’1′ and b=’2′ 在加一个b的索引就好了,因为之前加过a的单列索引了,他很确定的告诉我,因为我没有测试过,所以没有反驳。在回去的路上我一直想不通,多个单列的索引和联合索引都一样的速度,联合索引还有什么用?
今天有空来做个试验,当然之前我已经查过资料了,为了确定一下
创建一个users表

  1. CREATE TABLE `users` (
  2. `userID` int(11) NOT NULL AUTO_INCREMENT,
  3. `userName` varchar(20) NOT NULL,
  4. `password` varchar(20) NOT NULL,
  5. PRIMARY KEY (`userID`)
  6. )

创建一个genUsers存储过程,用来模拟数据

  1. delimiter $
  2. create procedure genUsers()
  3. begin
  4. declare i int default 0;
  5. while i < 100000 do
  6. set i = i + 1;
  7. insert into users(userID,userName,`password`) values(i,concat('username',i),concat('password',i));
  8. end while;
  9. end $
  10. delimiter ;

执行存储过程

  1. call genUsers();

复制表结构和数据

  1. CREATE TABLE users2 SELECT * FROM users;

添加userName,password单列索引

  1. alter table users add index userName(userName);
  2. alter table users add index password(password);
  1. select * from users where userName like 'username65%' and password like 'password65%'; 执行时间0.06 秒
  1. alter table users2 add index userName_password(userName,password);
  1. select * from users2 where userName like 'username65%' and password like 'password65%’;执行时间0.00秒

上面的结果每台机子测试的结果可能有所不同
原因是在mysql执行查询的时候,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。最左前缀:顾名思义,就是最左优先,打一比方
alter table users add index lname_fname_age(lname,fname,age);
创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)联合索引以及(lname,fname,age)联合索引。

QQ交流群:136351212(满) 455721967

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» MySQL单列索引和组合索引(联合索引)的区别详解
本文链接地址:https://www.phpsong.com/586.html

MySQL单列索引和组合索引(联合索引)的区别详解的更多相关文章

  1. mysql索引 多个单列索引和联合索引的区别详解

    背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引测 ...

  2. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  3. mysql索引失效原理(联合索引失效问题)

    单值索引B+树图单值索引在B+树的结构里,一个节点只存一个键值对 联合索引开局一张图,由数据库的a字段和b字段组成一个联合索引. 从本质上来说,联合索引也是一个B+树,和单值索引不同的是,联合索引的键 ...

  4. MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  5. 【Mysql】—— MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  6. MySql(三):MyISAM和InnoDB区别详解

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  7. 【转】MySQL存储引擎中的MyISAM和InnoDB区别详解

    转自:http://www.jb51.net/article/62457.htm MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Ac ...

  8. MySQL数据库系列(三)- MySQL常用引擎MyISAM和InnoDB区别详解

    概述 InnoDB:在MySQL 5.5及之后的版本,InnoDB是MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎.它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回 ...

  9. MYSQL数据库引擎区别详解

    数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...

随机推荐

  1. ROS知识(17)----Actionlib使用的例子

    1.Actionlib原理 英文版:DetailedDescription 翻译版:actionlib的身世之谜 2.Actionlib官方教程 Actionlib是ros的重要部件,对于复杂动作的执 ...

  2. 关于Vue的一些小技巧

    前言 用Vue开发一个网页并不难,但是也经常会遇到一些问题,其实大部分的问题都在文档中有所提及,再不然我们通过谷歌也能成功搜索到问题的答案,为了帮助小伙伴们提前踩坑,在遇到问题的时候,心里大概有个谱知 ...

  3. Kernel Newbies内核开发新手的资源

    Jessica McKellar在Ksplice blog上的博客文章 <Linux Device Drivers> 如果你在写一个操作系统,OSDev wiki是一个不错的网站 Kern ...

  4. 在gdb将所有线程的堆栈输出到文件中去

    http://m.blog.csdn.net/blog/lantianjialiang/40111253

  5. 通过内存盘提高MSMQ的消息吞吐能力

    转载:http://www.ikende.com/blog/00f2634be4704b79a3e22439edeb1343 由于MSMQ的消息交互都需要对磁盘进行读写操作,所以提高MSMQ的消息吞吐 ...

  6. 如何使用==操作符,Equals方法,ReferenceEquals方法,IEquatable接口比较2个对象

    "世界上不会有两片完全相同的树叶",这句话适用于现实世界.而在软件世界中,这句话变成了"世界上必须有两片完全相同的树叶",否则,很多事情无以为继. 当比较2个对 ...

  7. java基础知识概要图

  8. #pragma mark 添加分割线 及 其它类似标记 - 转

    #pragma marks Comments containing: MARK: TODO: FIXME: !!!: ???: 除了使用 #pragma mark -添加分割线之外, 以上几种标记均可 ...

  9. putty的保存功能如何使用

    Putty的设置保存功能隐藏的实在太好了,原来在Connection菜单中修改设置后,并不能在该界面保存. 保存步骤: 1.需要点击Session菜单,选中下面的Default Setting. 2. ...

  10. Python kmean

    # -*- coding: utf-8 -*-from sklearn.cluster import KMeansfrom sklearn.externals import joblibimport ...