select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'

其中column1,column2 ,column3分别单独建立了3个单索引。

与其说是“数据库查询只能用到一个索引”,倒不是说是 和全表扫描/只使用一个索引的速度比起来,去分析两个索引二叉树更加耗费时间,所以绝大多数情况下数据库都是是用一个索引。

如这条语句:

select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'

我们来想象一下当数据库有N个索引并且查询中分别都要用上他们的情况:

查询优化器(用大白话说就是生成执行计划的那个东西)需要进行N次主二叉树查找[这里主二叉树的意思是最外层的索引节点],此处的查找流程大概如下:

查出第一条column1主二叉树等于1的值,然后去第二条column2主二叉树查出foo的值并且当前行的coumn1必须等于1,最后去column主二叉树查找bar的值并且column1必须等于1和column2必须等于foo。

如果这样的流程被查询优化器执行一遍,就算不死也半条命了,查询优化器可等不及把以上计划都执行一遍,贪婪算法(最近邻居算法)可不允许这种情况的发生,所以当遇到以下语句的时候,数据库只要用到第一个筛选列的索引(column1),就会直接去进行表扫描了。

select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'

所以与其说是数据库只支持一条查询语句只使用一个索引,倒不如说N条独立索引同时在一条语句使用的消耗比只使用一个索引还要慢。

所以如上条的情况,最佳推荐是使用index(column1,column2,column3) 这种联合索引,此联合索引可以把b+tree结构的优势发挥得淋漓尽致:

一条主二叉树(column=1),查询到column=1节点后基于当前节点进行二级二叉树column2=foo的查询,在二级二叉树查询到column2=foo后,去三级二叉树column3=bar查找。

mysql只能用一个索引_mysql只会使用到一个索引的原因相关推荐

  1. mysql字段简索引_MySQL常用的一些语句,索引,字段等

    1.库相关: 建库: character set:指定编码 COLLATE:排序规则 utf8mb4_general_ci 大小写不敏感 CREATE DATABASE `test_db` defau ...

  2. mysql创建联合索引_mysql如何创建多个联合索引

    mysql创建多个联合索引的方法:可以使用CREATE INDEX或ALTER TABLE语句来创建.在创建联合索引时,应该仔细考虑列的顺序. MySQL中索引规则: 1.需要加索引的字段,要在whe ...

  3. mysql新增BTREE索引_mysql如何添加多个btree索引

    目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 1.B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度值不超过1,而且同层级的节点间有指针相互链接 2.在B+树 ...

  4. mysql为什么用索引_MySql为什么使用B+树做索引

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上.这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个 ...

  5. mysql 重复率高字段 索引_MySQL性能优化(二)索引优化

    一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...

  6. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

  7. mysql为什么用B 树做索引_mysql为什么用b+树做索引

    关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...

  8. mysql in 命中索引_MySql优化-你的SQL命中索引了吗

    在项目开发中SQL是必不可少的,表索也一样.这些SQL的运行性能不知道吗?有多少是命中了索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下. ...

  9. MySQl中文1001无标题_Mysql中字段类型不一致导致索引无效的处理办法

    前两天有个同事算数据,写出来的sql执行很慢.那个sql也很简单,就是一个左联带条件的查询.explain之后发现,其中有一张表没有用到索引.初始以为是没有建索引,于是建上索引再试,发现问题依旧.后来 ...

最新文章

  1. 2018-3-21李宏毅机器学习视频笔记(十二)--Backpropagation
  2. Unable to start activity ComponentInfo
  3. js实现线路流动_52期:实现redux与reactredux
  4. Docker Vs Podman
  5. Java跳转语句break与continue
  6. 牛客网刷题知识汇总2
  7. SAP License:2021年度最新FICO面试题目
  8. [Win32] 打字游戏MFC版
  9. linux看caj文件格式,CAJ 文件扩展名: 它是什么以及如何打开它?
  10. Wise Force Deleter(电脑文件强制删除软件)官方中文版V1.5.3.54 | 支持强制删除超大文件夹
  11. 大数据面试常见问题(三)——Hadoop部分
  12. 五狂徒盖伦过来插眼 准备边学边写 Egret 游戏
  13. 深圳招银java社招都有hr面吗,深圳招银网络科技
  14. 第十一届蓝桥杯省赛B组(C/C++组)(第一场)
  15. 揭秘微信新骗局:微信扫码进群付费暗雷源码 诱导支付百倍暗雷程序-如何判刑,如何举报?
  16. 微型计算机基础pdf,微型计算机硬件基础.pdf
  17. 上海和南京211计算机,高考分数线解析:上海院校vs外地211(二)
  18. 阅文集团内容中心id生成器的设计与实现
  19. 欢乐颂之鸿蒙系统,《欢乐颂3》开机惹众议,蒋欣王子文疑似被换?导演是这样回复的...
  20. java实现打印某一年的月份(以2017年的为准)

热门文章

  1. 介绍MyBatis代码生成网站(四) --- 继承基类
  2. 301. Remove Invalid Parentheses
  3. easyuI企业管理系统-实战三 添加功能
  4. ARM公布“物联网”嵌入式mbed OS系统软件平台
  5. cursor:hand与cursor:pointer的区别介绍
  6. CCNA综合实验配置
  7. 从身份管理系统思考企业CMDB的建设
  8. 测试工程师良品 —— Fiddler 工具简介
  9. [阿里云Java Web环境搭建]二、Ubuntu安装JDK
  10. 运维自动化轻量级工具pssh