索引是什么?
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 (硬盘级的)
为什么要使用索引?
索引能极大的减少存储引擎需要扫描的数据量
索引可以把随机IO变成顺序IO
索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。
平衡二叉树的缺点(每个节点的高度不超过1):数据所在的深度决定他的io操作次数 io操作耗时很大
每一个磁盘块保存的数据量太小了(关键字,数据,子节点引用)
没有很好的利用操作磁盘io的数据交换特性,和磁盘io的预读能力 而带来频繁的io操作
B+TREE 与B-TREE(多路平衡查找树) 的区别
B+节点关键字搜索采用闭合区间
B+非叶子节点不保存数据相关信息,只保存关键字和子节点的引用
B+关键字对应的数据保存在叶子节点中
B+叶子节点是顺序排序的,并且相邻节点具有顺序引用的关系
为什么选用B+TREE
B+树是B-树的变种多路绝对平衡查找树,他拥有B-树的优势
B+树扫库、表能力更强
B+树的磁盘读写能力更强
B+树的排序能力更强
B+树的查询效率更加稳定
聚集索引
数据库表行中数据的物理顺序与键值逻辑(索引)顺序相同
索引 (单列 联合)
单列索引是特殊的联合索引
联合索引的选择原则:最左匹配原则 离散度高原则 (最小空间原则宽度小的优先)
覆盖索引
如果查询列可通过索引节点中的关键字直接返回,则该索引称之为覆盖索引。
覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能
索引的使用建议
索引列的数据长度能少则少
索引一定不是越多越好、越全越好、一定是建立合适的
匹配列前缀可用到索引like 88% 但是like%78,%5% 用不到索引
where条件中的<>,not in 用不到索引
匹配范围值,order by 也可用到索引
多用指定列查询,只返回自己想要的数据列。少用select *
联合索引列中如果不是按照索引最左列开始查找,无法使用索引
联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引
联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引
列的离散性:离散性越高 选择性越好
最左匹配原则:对索引中关键字进行计算比对,一定是从左往右依次进行,且不可跳过
mysql的体系结构
存储引擎介绍:插拔式的插件方式
是在表之上的,即一个库中的每个表都可以指定不同的存储引擎
不管表采用什么样的存储引擎 都会在数据区产生对应的一个frm文件
csv存储引擎 不能定义索引, 不能为 数据的快速导出
Archive 存储引擎 压缩协议 没有事务 日志系统 大量设备采集用
myisam: mysql5.5之前是默认的,
select count(*)from table 无需进行数据的扫描
数据myd和索引 myi 分开存储
表级锁
不支持事务
innodb:5.5 版本后的默认的 支持事务 行级锁 聚集索引 支持外键关系保证数据完整性
mysql 查询优化: 1 mysql客户端和服务端通讯 半双工方式 eg踢足球 对讲机
2 查询缓存
3 解析器 预处理 查询优化器
4 查询执行引擎 5返回结果 到客户端
事务的特性:原子 一致性 隔离 持久
4种隔离级别 未提交读 RU 提交读 RC(解决脏读) 可重复读 RR(解决不可重复读) 串行化
锁:用于管理不同事务对共享资源的并发访问
配置优化:全局参数 会话参数(不单独设置则采取全局参数)
全局配置文件参数:
最大链接数配置:max_connections 5.6以后版本 默认151 需要考虑 句柄数的设置
系统句柄数配置:/etc/security/limits.conf ulimit -a
mysql句柄数配置:/usr/lib/systemd/system/mysql.service
port=3306 lower_case_table_names=0 表名区分大小写
server_id=1 tmp_table_size=16M 临时表大小 transaction_isolation=RR 指定事务隔离级别等
内存参数的配置:
排序缓冲区 关联查询缓存区等
Innodb_buffer_pool_size innodb的缓冲区大小配置 默认 128m 缓存了数据(数据缓存 索引缓存 缓冲数据 内部结构)
其他参数配置:
wait_timeout 服务器关闭非交互链接之前等待活动的秒数
innodb_open_files 限制Innodb能打开表的数据
数据库表设计
3范式 1 每一列只有一个单一的值,不可再拆分 2 每一行都有主键能进行分区 3 每一个表都不包含其他表已经包含的非主键信息
如何定位慢sql: 业务驱动 测试驱动 慢查询日志 show variables like ‘slow_query_log’
日志分析工具:mysqlsla
死锁:多个并发事务 每个事务都有锁 每个事务都需要再继续持有锁 事务之间产生加锁的循环
死锁的避免:类似的业务逻辑以固定的顺序访问表和行
大事务拆分
在同一个事务中尽可能做到一次锁定所需的资源
降低隔离级别
给表添加合理的索引
mvcc 多版本并发控制