MySQL学习目录
 
 
 
Mysql 慢查询该如何优化?
1.检查是否走索引,如果没用则优化SQL利用索引
2.检查所利用索引,是否为最优索引
3.检查所查询字段是否都是必须的,是否查询了过多的字段,查出了多余数据
4.检查数据是否过多,是否应该进行分库分表了
5.检查数据库实例所在机器的性能配置,是否太低,是否可以适当增加资源
6.结合实际,看服务与数据库间的网络环境,是否不属于不同的网络环境,是否需要通过VPN等手段,如果是需要优化网络
7.结合实际,查看分配的Mysql实例是否为共享实例,是否有其他项目再使用同一实例,造成连接数不够或者Mysql数据库压力过大
 
消息队列有哪些作用?
1.解耦:使用消息队列来作为两个系统直接的通讯方式,两个系统就不需要直接相互依赖了
2.异步:系统A给消息队列发送完消息之后,就可以继续处理其他事情,无需等待执行结果,适用于耗时或者耗资源的操作
3.流量消峰:如果使用消息队列的方式来调用某个系统,那么消息将在队列中排队,由消费之自己控制消费速度
 
索引是什么?
索引是帮助MySQL高效获取数据的排好序的数据结构
索引值为key,磁盘地址为value的K-V结构
 
索引的数据结构
1.二叉树
2.红黑树
优化版本的二叉树,就是对树的结构进行自行调节,降低树的高度,即查询次数
3.Hash表
4.B-Tree
 
Mysql B+Tree 特点:
1.非叶子节点不存储data,只存储索引(冗余),可以更多的索引
2.叶子节点包含所有的索引字段
3.叶子节点用指针连接,提高区间访问的性能 双向链表
MySQL每个节点是一页数据,允许的大小是16KB show GLOBAL status like 'Innodb_page_size';
 
数据库所谓的存储引擎都是表级别生效的。
 
MySQL表文件:
1.frm文件 表结构信息
2.MYD文件 MYISAM引擎的表数据文件
3.MYI文件 MYISAM引擎的索引文件
MYISAM 查询走索引时,先从索引文件(MYI)中定位到索引值读取到索引值对应的磁盘地址,再根据磁盘地址取读数据文件(MYD)中对应的数据。
 
Innodb 表文件:
1.frm文件 表结构文件
2.ibd文件 表索引以及数据文件
 
InnoDB引擎索引的实现(聚集)
1.表数据文件本身就是B+Tree组织的一个索引结构文件
2.聚集索引-叶节点包含了完整的数据记录(聚簇索引) 延申:什么是非聚集索引? 索引文件和数据文件是分离的,不在同一个文件中这种可以理解为非聚集索引
3.为什么建议InnoDB表必须建主键,并且推荐使用整型自增主键?
如果不创建主键列,MySQL需要自行维护一列,来确保可以创建B+Tree.
最好用数字类型,因为在构建B+Tree和查询数据时,有大量的需要主键去比大小的过程,数字类型比字符串大小比较时会更快,并且整形更省空间。
为什么自增?插入数据时,减少索引值比较,和减少索引页的分裂。
4.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间,
 
InnoDB中只有主键索引是聚集索引,其他的二级索引不是。
InnoDB中只有通过主键索引查找数据的时候,可以直接读取数据。
通过其他索引查询时,查找到的时该表的主键,然后再通过主键的聚集索引读取到数据。这个过程依然属于回表。
 
Hash 数组+链表
1.对索引的key进行一次hash计算就可以定位出数据存储的位置
2.很多时候Hash索引要比B+树索引更高效
3.仅能满足“=”,“IN” 不支持范围查询
4.hash冲突问题
 
查询数据文件及索引文件大小:
SELECT DATA_LENGTH / (1024 * 1024 ) AS 'DATA_SIZE(MB)', INDEX_LENGTH / (1024 * 1024 ) AS 'INDEX_SIZE(MB)', TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = 'tianqing_routing';
posted on 2022-06-23 18:45  CRUDEngineer  阅读(126)  评论(0编辑  收藏  举报