mysql只能用一个索引_mysql只会使用到一个索引的原因
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只会使用到一个索引的原因相关推荐
- mysql字段简索引_MySQL常用的一些语句,索引,字段等
1.库相关: 建库: character set:指定编码 COLLATE:排序规则 utf8mb4_general_ci 大小写不敏感 CREATE DATABASE `test_db` defau ...
- mysql创建联合索引_mysql如何创建多个联合索引
mysql创建多个联合索引的方法:可以使用CREATE INDEX或ALTER TABLE语句来创建.在创建联合索引时,应该仔细考虑列的顺序. MySQL中索引规则: 1.需要加索引的字段,要在whe ...
- mysql新增BTREE索引_mysql如何添加多个btree索引
目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 1.B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度值不超过1,而且同层级的节点间有指针相互链接 2.在B+树 ...
- mysql为什么用索引_MySql为什么使用B+树做索引
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上.这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个 ...
- mysql 重复率高字段 索引_MySQL性能优化(二)索引优化
一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...
- mysql explain 索引_MySql中Explain详解与索引最佳实践
使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...
- mysql为什么用B 树做索引_mysql为什么用b+树做索引
关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...
- mysql in 命中索引_MySql优化-你的SQL命中索引了吗
在项目开发中SQL是必不可少的,表索也一样.这些SQL的运行性能不知道吗?有多少是命中了索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下. ...
- MySQl中文1001无标题_Mysql中字段类型不一致导致索引无效的处理办法
前两天有个同事算数据,写出来的sql执行很慢.那个sql也很简单,就是一个左联带条件的查询.explain之后发现,其中有一张表没有用到索引.初始以为是没有建索引,于是建上索引再试,发现问题依旧.后来 ...
最新文章
- 2018-3-21李宏毅机器学习视频笔记(十二)--Backpropagation
- Unable to start activity ComponentInfo
- js实现线路流动_52期:实现redux与reactredux
- Docker Vs Podman
- Java跳转语句break与continue
- 牛客网刷题知识汇总2
- SAP License:2021年度最新FICO面试题目
- [Win32] 打字游戏MFC版
- linux看caj文件格式,CAJ 文件扩展名: 它是什么以及如何打开它?
- Wise Force Deleter(电脑文件强制删除软件)官方中文版V1.5.3.54 | 支持强制删除超大文件夹
- 大数据面试常见问题(三)——Hadoop部分
- 五狂徒盖伦过来插眼 准备边学边写 Egret 游戏
- 深圳招银java社招都有hr面吗,深圳招银网络科技
- 第十一届蓝桥杯省赛B组(C/C++组)(第一场)
- 揭秘微信新骗局:微信扫码进群付费暗雷源码 诱导支付百倍暗雷程序-如何判刑,如何举报?
- 微型计算机基础pdf,微型计算机硬件基础.pdf
- 上海和南京211计算机,高考分数线解析:上海院校vs外地211(二)
- 阅文集团内容中心id生成器的设计与实现
- 欢乐颂之鸿蒙系统,《欢乐颂3》开机惹众议,蒋欣王子文疑似被换?导演是这样回复的...
- java实现打印某一年的月份(以2017年的为准)
热门文章
- 介绍MyBatis代码生成网站(四) --- 继承基类
- 301.	Remove Invalid Parentheses
- easyuI企业管理系统-实战三 添加功能
- ARM公布“物联网”嵌入式mbed OS系统软件平台
- cursor:hand与cursor:pointer的区别介绍
- CCNA综合实验配置
- 从身份管理系统思考企业CMDB的建设
- 测试工程师良品 —— Fiddler 工具简介
- [阿里云Java Web环境搭建]二、Ubuntu安装JDK
- 运维自动化轻量级工具pssh