mysql杂项

简介: MySQL常用存储引擎包括InnoDB和MyISAM,InnoDB支持事务和行锁,适合高并发写入;MyISAM不支持事务,仅支持表锁,适合只读场景。InnoDB支持64TB存储,MyISAM支持256TB。索引结构主要包括B+树、Hash和跳表,用于优化查询性能,减少磁盘I/O。InnoDB使用聚簇索引,MyISAM使用非聚簇索引。联合索引需遵循最左前缀原则,否则可能导致索引失效。常见索引失效原因包括使用函数、隐式转换、模糊查询前缀使用“%”等。可通过EXPLAIN命令分析SQL执行情况。MySQL性能优化包括表结构设计、SQL优化、主从复制、读写分离及分库分表。

mysql常用存储引擎

常用的有两种:innodb,myisam

innerdb支持64tb的存储,myisam支持256tb

myisam不支持外键和事务

innodb:支持行锁和表锁,仅对修改的数据行加锁,适用于事务,高并发写入

myisam:支持表级锁,读写锁整张表,适用于只读

mysql的索引

索引的底层结构:常用的是B+树,还有hash和跳表

B+树:叶子节点(聚簇索引:存储完整数据innnodb)/(非聚簇索引:存储数据地址myisam)

叶子节点通过双向链表连接,支持范围查找(通过叶子节点快速遍历),支持排序(索引本身有序)

hash:支持等值查询

跳表:支持范围查找和排序,效率高于b+树

索引:主要用来优化查询,减少磁盘i/o,

单表:主键(非空唯一),唯一,普通(无特定要求),全文索引(作用域char,vachar,text)

组合:遵循最左前缀原则

聚簇索引(通过索引直接找到对应的数据行,无需回表), 主键

一张表只能有一个聚簇索引,一般是主键,因为物理存储顺序唯一,

非聚簇索引(通过索引找到的是对应数据的地址)唯一,普通,联合

B树 存储的完整数据,树比较高,在数据比较少的情况下,不需要回表,但是数据量大的话,io开销比较大

什么是回表查询,什么是覆盖索引

  • 回表查询:需要通过二级索引找到主键后,再查主键索引获取完整数据,性能相对较低。
  • 覆盖索引:查询字段都在索引中,无需回表,性能更优。(目录中包含了所需要查找的内容,就是目录中包含部分信息,非聚簇索引是只有目录),实际上覆盖索引就是非聚簇索引,仍然会通过覆盖索引查找到聚簇索引,再查询到需要的数据行,因此覆盖索引不需要添加聚簇索引(降低效率)例如:id name age(三个字段) 变成联合索引只需要name和age ,id就不用加入了
  • 举例子
  • sql
SELECT order_no, amount FROM orders WHERE user_id = 10086;

不使用覆盖索引的情况:

  • 数据库会先通过idx_user_id索引找到所有user_id=10086的记录,得到这些记录的主键id
  • 然后需要回表到主键索引中,才能获取order_no和amount字段的值
  • 这会产生两次索引查找,性能相对较低

使用覆盖索引的优化:

创建包含查询所需所有字段的复合索引:

CREATE INDEX idx_user_order_info ON orders (user_id, order_no, amount);

此时再执行相同查询:

  • 数据库直接在idx_user_order_info索引中就能找到user_id=10086对应的order_no和amount
  • 索引本身已经包含了查询需要的所有字段(筛选条件user_id和查询结果order_no、amount)
  • 不需要回表操作,一次索引查询就能完成,大大提升查询效率

三个共同构建索引

业务先行,索引后到(根据优化情况来创建,比如慢sql等等。。)

什么是左前缀原则

联合索引在 B+ 树中按列顺序排序:先按  a  排序, a  相同的记录再按  b  排序, a  和  b  都相同的再按  c  排序(即  a  是第一排序键, b  是第二排序键, c  是第三排序键)。

本质上就是一层层排序,因此只有按顺序才能是索引成功,增强查找效率,如果不按照顺序的话,就要全表查询(因为索引的本质是B+树相对有序的,因此构建联合索引就相当于进行一次排序,)

什么情况下索引会失效[重点]

违反左前缀原则

进行函数的处理或者加减乘除运算count(索引列)avg索引列不算substr截取会导致失效

隐式转换

使用!=本质上也属于一种范围式查找号

范围查询

模糊查询前用%

or链接的列存在非索引列

可以通过explain命令分析查看type列是否为all来判断是否失效,查看key的命中率

mysql的性能优化[重点]

表设计的优化,根据实际情况选择合适的类型参考阿里规范(比如设置数据库字段对应的类型,采用tinyint还是int还是bigint,对应的char和vachar的大小,设定等等)

sql优化:

比如使用select时尽量指明字段避免使用select*,

注意避免索引失效

联合查询尽量使用union all 代替union, union会多一次过滤,去除重复行,效率低

如果表关联的话,尽量使用 innerjoin  不要使用left 或者rigt必须使用则尽量要以小表为驱动,因为驱动表是全量遍历,被驱动表是根据条件筛选的

主从复制,读写分离,不让数据的写入影响读操作

分库分表,水平拆分(解决数据量问题),和垂直拆分(数据库字段过多的问题)

如何定位慢查询[重点]

 调试工具:skywalking  arthas

mysql的自带慢日志,默认未开启

一个SQL语句执行很慢, 如何分析 [重点]

在查询语句前添加explain,通过key和keylen来判断索引命中情况

或通过type的值是all来判断是否是全表扫描通过

extra判断是否出现回表

同时sql语句很慢一般分为

暂时慢:需监控运行时状态,排查并发、锁、后台任务等临时干扰因素,减少环境波动影响

一直慢:优化sql语句

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 监控 调度
如何在阿里云OSS之间进行数据迁移呢?
讲解如何在阿里云对象存储OSS之间进行跨账号、跨地域、以及同地域内的数据迁移,包括数据迁移之前的准备工作和实施数据迁移以及一些后续操作,使用在线迁移服务,您可以将第三方数据轻松迁移至阿里云对象存储OSS,也可以在对象存储OSS之间进行灵活的数据迁移。
|
API PHP 索引
这插件太危险了!PDFParser自动扒取PDF每天躺赚300+的暴利搬运术
本文介绍了如何使用PHP提取PDF文档中的文字内容。为解决PDF文档“不可编辑”或“文本无法复制”的问题,推荐使用免费的PHP库——PDFParser。通过Composer安装后,可利用其简单强大的API解析PDF文件,提取文本内容。文章详细演示了获取PDF基本信息、全文内容、指定页内容及循环输出每页文本的方法,并附带中英文PDF示例,操作简便实用。
这插件太危险了!PDFParser自动扒取PDF每天躺赚300+的暴利搬运术
|
自然语言处理 测试技术 API
TCPDF库详解:功能、作用及多语言安装指南-tcpdf可不是只有php能用-优雅草卓伊凡
TCPDF库详解:功能、作用及多语言安装指南-tcpdf可不是只有php能用-优雅草卓伊凡
920 5
|
分布式计算 DataWorks 监控
dataworks组件
DataWorks 可能会添加新的功能或改进现有的组件,因此建议查阅最新的官方文档以获取最准确的信息。
555 2
|
监控 安全 测试技术
《API接口大揭秘:如何让你的业务快人一步?》
API(应用程序编程接口)是连接不同系统和服务的桥梁,通过标准化协议简化开发流程。其核心价值在于提升效率、降低成本并加速创新,使企业能聚焦核心业务。API分为开放API、内部API和合作伙伴API,适用于不同业务场景。设计与开发API需遵循关键原则,如标准化协议、清晰文档和安全机制。高效集成API可通过使用SDK、自动化测试与监控及容错重试机制实现。在电商、物联网和数据分析等领域,API有广泛应用。未来,Serverless架构、AI驱动API和性能优化将成为发展趋势。商业化运营需关注安全防护、性能优化和策略制定,以释放API的商业潜力。
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
691 20
|
供应链 Serverless BI
基于阿里云区块链服务(BaaS)的供应链金融系统开发与部署
随着区块链技术的快速发展,其在供应链金融领域的应用成为热点。阿里云区块链服务(BaaS)提供安全、高效、易用的平台,支持Hyperledger Fabric和蚂蚁区块链,帮助企业快速构建供应链金融系统。本文通过实战案例展示基于阿里云BaaS开发供应链金融系统的全流程,涵盖企业认证、应收账款融资、交易记录及数据分析等功能,显著提升透明度和可信度,降低融资成本。
|
Linux 网络安全
FTP被动模式配置
FTP被动模式配置
1733 1
|
机器学习/深度学习 人工智能 Ubuntu
|
安全 网络协议 网络安全