mysql中b树是什么_MySQL优化中B树索引知识点总结
为什么要进行SQL优化呢?很显然,当我们去写sql语句时:
1会发现性能低
2.执行时间太长,
3.或等待时间太长
4.sql语句欠佳,以及我们索引失效
5.服务器参数设置不合理
SQL语句执行过程分析
1.编写过程:
编写过程就是我们平常写sql语句的过程,也可以理解为编写顺序,以下就是我们编写顺序:
select from join on where 条件 group by 分组 having过滤组 order by排序 limit限制查询个数
我们虽然是这样去写的,但是它mysql的引擎去解析时,并不是依照我们以上编写的这样的顺序;
它并不是先解析select 而是先解析from,也就说,我们的解析过程跟编写过程是不一致的,所以我们看下发的解析顺序
2.解析过程:
from on join where group by having select order by limit
以上就是mysql的解析过程,我们发现,跟我们编写的过程完全不一致!
索引
什么是索引(index)?简单的来讲就是书的目录;
比如说我现在要通过字典来查“王”这个字,如果你在没有目录的情况下去找“王”这个字,你就需要把这个字典从头到尾的翻一遍,如果有一千页,你就必须一页一页的去翻,直到找到为止;
索引就相当于目录,查这个“王”之前先去翻看目录,发现“W”在300页,因为王首字母是“W”,我们直接去在300页中找,这样找起来就非常快;
索引在数据库中是关键字insex,用官方的定义的意思来说,索引就是帮助MySQL快速高效的获取数据的数据结构;
索引是一个数据结构,它是一个为了高效查询数据的数据结构;
那它到底是什么数据结构呢?
其实它就是一个树,我们用的比较多的就是B树、Hash树,在MySQL里面,用的就是B树索引;
B树索引
首先我画一个图,假装这个是数据表,并且给age列加一个索引:
就把这个索引当成一个目录,也就是age为50的,就指向第一行,age为33的,指向第五行;
下面我会将B树索引画出来,看看到底是怎么索引了:
我们给age加了索引列后,它就会像树一样,把小的放到左边,把大的放到右边,第一列为50,比50小的在左边,23,比23小的继续向左排列,
33比23大,就向左排列20比22小就在22后面继续向左排列,以此类推!
比如我们现在需要查33:
select * From 表名 where age = 33;
不加索引的话,就会从50开始查,50不是 23,不是22不是....,不加索引就一个个去找;
如果加索引的话,找33,发现33比50小,第一次,再去找23,第二次,33比23大,第三次,仅需三次就查到了:
索引的弊端
1.索引本身很占空间,可以存放在内存/硬盘(通常)
2.索引不是所有情况均可适用比如:少量数据、频繁更新的字段(如果数据表中的某一列经常会发生改变,那么这一列就不适合做索引)
3.索引确实可以提高查询效率,但是同时会降低增删改的效率,比如:
我们没有索引,你改44,改成45,很好改,直接改就行了,如果你有索引,我不光要改表里面的44,我需要把B树里面的44也要改:
有些人就觉得不划算了,提升一个降低三个,这样就很不划算了,其实很划算的!
因为我们大部分情况下都是在查询,增删改很少,因为查询影响性能很大的,所以非常有必要使用它
索引的优势
1.提高了查询效率
客户端到服务端,链接服务端是通过IO,通过输入输出流,所以说,提高查询效率就是降低了IO的使用率
2.降低CPU使用率
比如说我sql里面有一个order by desc 根据年龄降序或升序,如果没有索引,你需要把age全部拿出来全部排个序,但是如果有了索引,你就不需要排序了,B树本身就是一个排好序的结构,最左边必然是最小的,最最右边必然是最大的:
只需要根据一定的规则遍历出来就行了。
以上就是相关的B数索引的相关知识点,感谢大家的阅读和对脚本之家的支持。
mysql中b树是什么_MySQL优化中B树索引知识点总结相关推荐
- mysql join大小表顺讯_MySQL优化器join顺序
前一篇介绍了cost的计算方法,下面测试一下两表关联的查询: 测试用例 CREATE TABLE `xpchild` ( `id` int(11) NOT NULL, `name` varchar(1 ...
- mysql 走索引 很慢_MySQL优化:为什么SQL走索引还那么慢?
背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 core 分析过程 接手这个问题时现场已经不在了,信息有限,所以我们先从 ...
- mysql索引使增删变慢_mysql优化(四)–索引
http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 一. 四种索引类型: 主键索引,唯一索引,全文索引,普通索引 二. 为什 ...
- mysql in从数据库取数_MySQL数据库中 where in 用法详解
本文主要向大家介绍了MySQL数据库中 where in 用法详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这里分两种情况来介绍 WHERE column IN (valu ...
- MYSQL中RAND子句的使用_mysql优化--rand()优化
众所周知,在mysql中,随机的取10条数据,如:select * from users order by rand() limit 10,效果非常差,因为会多次的执行,如果等值查询用rand()也是 ...
- mysql+index组合索引_MySQL 优化之 index merge(索引合并)
标签: MySQL5.0之前,一条语句中一个表只能使用一个索引,无法同时使用多个索引.但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引.理解了 index mer ...
- mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...
php mysql limit 分页优化,页面越大查询越慢 一.测试前言 当前测试表:nodes_hierarchy目前数据量为20多万 程序分页中我们经常使用的核心sql语句select * fro ...
- mysql中的删除语法错误_mysql – EXPLAIN中的SQL语法错误
我试图让一个解释命令在 mysql中工作.我正在尝试解决此删除查询的性能问题: DELETE FROM boost_cache_relationships WHERE base_dir = 'cach ...
- mysql 触发器 for each row 理解_MySQL触发器中的“ FOR EACH ROW”如何工作?
实际上," FOR EACH ROW"意味着每个匹配的行都将被更新或删除.换句话说,我们可以说触发器没有应用于每一行,它只是说要为每个受影响的表行执行触发器主体.我们可以通过以下示 ...
最新文章
- nodejs报错解决:Error: Can only perform operation while paused. - undefined
- JVM学习笔记之四:分代垃圾回收
- 配置整合DWR3.0和Spring2.5使用annotation注解
- docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器
- 江小白包装设计原型_雪碧和江小白的品牌跨界合作之旅可谓是一场品牌包装的视觉盛宴...
- windows如何生成ssh密钥
- pytorch使用早停策略
- 2010年年度 “中国智能建筑品牌奖”获奖名单
- 【语音去噪】基于matlab谱减法去噪【含Matlab源码 429期】
- java水果超市管理系统
- gerber文件怎么导贴片坐标_如何学习贴片机编程
- 软件相貌测试准确吗,测另一半的相貌超准软件 提前了解对象的外貌
- Matlab画图,坐标轴范围设置和间隔设置
- 导向滤波(Guided Filter)公式详解
- 如何查找计算机密码cmd,教你如何查看计算机所连wifi密码
- 北京电影学院及中央戏剧学院老师推荐的必看影片,我真是一条一条翻的,一条一条写的,是真的。...
- 白鹤芋一帆风顺花怎么养 一帆风顺花养殖方法及注意事项
- Kata Containers及相关vmm介绍
- 工业机器人什么情况下会出现奇点_机器人奇点是什么?他们怎么会像黑洞一样?...
- 【马士兵】Python基础--01
热门文章
- 树形数据深度排序处理示例(模拟单编号法).sql
- 帝国cms 6.6 采集入库多记录时出现空白 解决办法
- eclipse终止端处的加载主类错误
- normalize函数_【ADAMS】矩阵/数组函数
- 固态和机械硬盘组raid_联想G400拆机步骤(固态硬盘替换机械硬盘,机械硬盘替换光驱)...
- 1000道Python题库系列分享十(37道)
- hive导数据到mysql 自增主键出错_python+mysql做一个图书管理系统?
- C语言 如何计算结构体的大小
- 开源 php 报表,php网站流量统计系统-开源系统 | 学步园
- r语言代码html,R语言学习笔记-内附实例及代码