1.mysql索引结构b+树

a.首先要说二叉树,二叉查找树,数的结构不用多说,二叉查找树,大概就是几个原则,左边比右边的小,然后保持一个分布均匀,也就是树的高度尽量最小。

b.b-树,b-树和二叉查找树结构类似,但是每个节(页)点会有多个数据,

c.b+树和b-树最大的区别就是,只有叶子节点存数据。为啥,为了非叶子节点能够存储更多的索引,以便控制树的高度,树的高度决定了io次数,io是非常消耗性能的。

下图b-树

下图b+树

一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问指针。范围查找的时候等非常有用。

2.1000万数据的存储结构

在 MySQL 中我们的 InnoDB 页的大小默认是 16k,为16384

上图只是一个类似图,实际上根节点往往不止这点数据。

一上图2的高度来计算,假设前提是每页装满来算

结论1:根节点能存1170个指针(大概)

一页为16k(16384),我们假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170

结论2:一个叶子节点放16行数据

一页为16k,一行用1k来算的行就是16行。

结论3:高度为2的树数据为16*1170

根有1170个指针,一个指针指向一个页,一页有16条数据。

结论4:如果高度为3

1170*1170*13 大概2000w,第一层1170个指针,第二次每个也1170个指针,第三层叶子节点,每页为16行。

mysql不建议id用uuid或者雪花算法id,官方建议用自增id,其他id不是自增的,索引要保持有序性,需要磁盘数据重新挪动,产生io消耗。

mysql 锁

1.锁分类,表锁,行锁,页锁;共享锁,排他锁;乐观锁,悲观锁

2.innodb在增删改的时候回加上行锁,mysiam不会死锁,表级锁,查询的时候如果有索引会加上锁,如果每页条件,表级锁。

3.死锁。因为innodb的锁是分步获取的,比如事务a中,先获取id=1的数据,然后在获取id=2的数据;b事务中,先获取id=2,然后在获取id=1的数据。a,b事务会分别等待对方释放锁。

4.​ MVCC.MySQL InnoDB存储引擎,实现的是基于多版本并发控制协议—MVCC(Multi-Version Concurrency Control) MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突

https://blog.csdn.net/qq_38238296/article/details/88362999

1.  优化sql语句;

    原则: 1.1 尽量根据主键查询;

        1.2 尽量使用单表查询,不要使用关联查询;

        1.3 查询时可以使用in,但是绝对不要使用not in;

2.  创建索引;CREATE INDEX  索引名字  ON  表名称 (列名称);[列名称:规定你需要索引的列]。

3.  添加缓存;

    例如:mybatis的一、二级缓存;该操作效率低;

       redis缓存  /  memercache缓存(String);有效的缓解数据库的压力;

4.  使用数据库的读写分离;

5.  定期将历时数据进行转储;

6.  进行分库分表操作(最后的操作);数据库服务器数量和运维都需要花费很多时间和精力

7.       数据库引擎选择

8.       sql 语句分析 explain,其实就是看下各查询有没有用到索引,是不是失效了。

https://blog.csdn.net/fsdfkjai/article/details/121770629

1.联合索引 KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE,where条件写法,要先name,再age,再position

2.覆盖索引查询,不要select * 要select name,age 不用回表

3.索引列不做任何操作,WHERE left(name,3) = 'LiLei';

4.少用or或in,用它查询时,mysql不一定使用索引

5.mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描

< 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引

is null,is not null 一般情况下也无法使用索引

mysql索引 数据库优化的更多相关文章

  1. MySQL数据库索引类型、MySQL索引的优化及MySQL索引案例

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  2. 理解MySQL——索引与优化

    转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...

  3. mysql索引的优化

    MySQL索引的优化 上面都在说使用索引的好处,但过多的使用索引将会造成滥用.因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT.UPDATE和DEL ...

  4. 【真·干货】MySQL 索引及优化实战

    热烈推荐:超多IT资源,尽在798资源网 声明:本文为转载文章,为防止丢失所以做此备份. 本文来自公众号:GitChat精品课 原文地址:https://mp.weixin.qq.com/s/6V7h ...

  5. MySQL索引及优化(1)存储引擎和底层数据结构

    在昨天的面试中问到了MySQL索引怎么优化(查询很慢怎么办),回答的很不理想,所以今天来总结几篇关于MySQL索引的知识. 1.什么是索引? 首先我们一定要明确什么是索引?我自己的总结就是索引是一种数 ...

  6. mysql索引与优化

    mysql 索引与优化 http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html

  7. MySQL索引及优化(3)设计数据库

    一.范式和反范式 优秀的库表设计是高性能数据库的基础.如何才能设计出高性能的库表结构呢?这里必须要提到数据库范式.范式是基础规范,反范式是针对性设计. 1.1.范式 范式是设计数据库结构过程中所要遵循 ...

  8. (转)理解MySQL——索引与优化

    参考资料:http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html ———————————— 全文: 写在前面:索引对查询的速度有着 ...

  9. 1020理解MySQL——索引与优化

    转自http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性 ...

  10. MySQL——索引与优化

    http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调 ...

随机推荐

  1. kali日常快捷命令(用到就更新)

    什么BASH命令? 在Linux上采用bash作为标准,基本上它描述了对带有".sh"扩展名的vi编辑器等文本的处理并执行. 与编程一样,它有许多函数,如变量,函数和算术处理,所以 ...

  2. Vulnhub:CK-00靶机

    kali:192.168.111.111 靶机:192.168.111.196 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  3. k8s之service服务

    service服务介绍 在k8s中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问 为了解决这个问 ...

  4. 采集存储计算处理卡设计原理图:619-基于6U VPX的双FMC ZU19EG 采集存储计算处理卡

    619-基于6U VPX的双FMC ZU19EG 采集存储计算处理卡   基于6U VPX的双FMC ZU19EG 采集存储计算处理卡 一.板卡概述 该板卡是采集.存储.计算.管理一体的高集成度.加固 ...

  5. cat /dev/null > file后,ls查看文件大小未减小,du查看变为0

    一句话总结: 其他程序正在使用command > file写入文件:将command程序kill后使用command >> file写入文件,即可在command写入file时,用c ...

  6. WinForms 嵌入 Web服务

    1.首先安装一个Kestrel服务器包 Microsoft.AspNetCore.Server.Kestrel 2.在Main方法中插入如下代码 static class Program { /// ...

  7. unity工程多开Bat

    %cd%:: 源路径set sourceDir=C:\Projects\XXX:: 目标路径set destDir=C:\Projects\XXX_Clone :: 如果目标路径不存在就创建if no ...

  8. redis之五种基本数据类型

    五种基本数据类型 redis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是:String.Lis ...

  9. IntelliJ IDEA2021.3破解教程【Windows10系统】

    IntelliJ IDEA2021.3破解教程[Windows10系统] 以下仅为本人工作.学习过程中所接触到的内容,不足之处请多包涵. 官网下载地址 最新版:https://www.jetbrain ...

  10. Python全栈学习笔记---网络编程(三)

    一.客户端/服务器架构 客户端:因特定需求联系服务器,并发送必要的数据,然后等待服务器响应,最后完成请求或给出故障原因.对服务进行一次性请求. 服务器:一组硬件和软件,为一个或多个客户端服务.存在的唯 ...