• 冲刺学习-MySQL-常见问题


    MySQL索引的最左原则

    联合索引的说明

    • 建立三个字段的联合索引
    • 联合索引(a,b,c)相当于建立了索引:(a),(a,b),(a,b,c)

    那么ac是否能用到索引呢?

    a可以命中联合索引(a,b,c),c无法命中,所以ac组合无法命中联合索引

    什么是最左前缀匹配原则?

    对于索引中的字段,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,c,d)的索引则都可以用到,a,b,d的顺序可以任意调整。
    = 和 in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化索引可以识别的形式

    index类型

    表示mysql会对整个该索引进行扫描。只要是索引,mysql都会采用index类型的方式进行扫描。但是效率不高,mysql会从索引中的第一个数据查到最后一个数据,直到查到结果

    ref类型

    表示mysql根绝特定算法快速找到符合条件的索引,二不是对索引的每一个数据都进行扫描判断。要实现这种快速的查询,就需要满足特定的数据结构
    索引字段的数据必须是有序的,才能实现这种类型的查找,才能利用到索引

    复合索引

    首先会对索引最左边的字段的数据进行排序,在第一个字段的排序基础上,然后再对后面的第二个字段进行排序
    所以第一个字段是绝对有序的,而第二个字段是无序的了,如果直接使用第二个字段去查,进行条件判断是用不到索引的

    当第一个字段进行了等值判断,那么第二个字段进行排序,也可以用到索引。当两个都是等值判断时,顺序是可以改变的,而且不影响结果
    mysql查询优化

    InnoDB和MyIsam引擎的区别?

    区别

    数据的存储结构不同

    1. 每个MyISAM在磁盘上存储成三个文件,它们以表的名字开头来命名。.frm文件存储定义,.MYD(MYD)存储数据文件,.MYI(MYindex)存储索引文件。由于索引和文件数据是分开存储的,所以查询时MyISAM的叶子节点存储的是数据所在的地址,而不是数据
    2. InnoDB在磁盘上保存为两个文件。.frm文件同样存储为表结构文件,.ibd文件存储的是数据和索引文件。InnoDB叶子节点存储的是整个数据行所有的数据

    存储空间的消耗不同

    1. MySIAM可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去除掉)、动态表、压缩表
    2. InnoDB需要更多的内存和存储,它会在主内存中建立专有的缓冲池用于高速缓冲数据和索引。InnoDB所在的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB

    对事务的支持情况不同

    1. MySIAM强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持
    2. InnoDB除了提供事务支持和外部键等高级数据库功能。还具有事务提交、回滚和崩溃修复能力等这些事务安全型表

    对锁的支持态度

    1. 如果只是执行大量的查询,MyISAM是更好的选择。MyISAM在增删的时候需要锁定整个表格,效率会低一些
    2. InnoDB支持行级锁,删除插入的时候只需要锁定操作行就行。如果有大量的插入、修改删除操作,使用InnoDB性能会更高

    对外键的支持不同

    MyISAM不支持外键,而InnoDB支持外键。当然,各种不同MySQL版本对两者的支持都有所改进

    是否为聚集索引

    InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的;MyISAM是非聚集索引,它也是使用B+Tree作为索引结构,但是索引和数据文件是分离的,索引保存的是数据文件的指针

    是否必须要主键

    InnoDB必须要有主键,MyISAM可以没有主键。InnoDB如果我们没有明确去指定创建主键索引。它会帮我们创建一个隐藏的6byte的int类型的索引作为主键索引

    辅助索引于主键索引之间的关系

    1. InnoDB辅助索引和主键索引之间存在层级关系,InnoDB如果添加其他辅助索引,辅助索引查询就需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键太大,其他索引也相应的会很大
    2. MyISAM则是平级关系。

    InnoDB不保存具体行数

    InnoDB执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行前面的命令会更快

    Innodb不支持全文索引,而MyISAM支持全文索引,在全文索引领域的查询效率上MyISAM速度更快高;

    InnoDB 的行锁是实现在索引上的,而不是锁在物理行上。如果访问未命中索引,也是无法使用行锁,将会退化为表锁

    InnoDB支持表级锁、行级锁,默认为行级锁;而 MyISAM 仅支持表级锁

    有哪些优化数据库性能的方法?

    优化可以从这四个方面入手:结构优化、硬件优化、DB优化、SQL优化
    位置越靠前优化越明显,对数据库的性能提升越高。我们常说的SQL优化反而是对性能提高最小的优化。

    架构优化

    • 分布式缓存(高并发、大数据量大场景)
      当接收到查询请求后,我们先查询缓存,判断缓存中是否有数据,有数据就直接返回给应用,如若没有再查询数据库,并加载到缓存中,这样就大大减少了对数据库的访问次数,自然而然也提高了数据库性能。
    • 读写分离(数据库读性能问题)
      一主多从,读写分离,主动同步,是一种常见的数据库架构优化手段。
      主库,提供数据库写服务;从库,提供数据库读能力;主从之间,通过binlog同步数据。
    • 水平切分(数据库数据量大的问题)
      当你的应用业务数据量很大,单库容量成为性能瓶颈后,采用水平切分,可以降低数据库单库容量,提升数据库写性能。

    硬件优化

    DB优化

    SQL优化

    • 合理使用索引
    • 使用UNION ALL代替UNION
    • 避免select * 写法
    • JOIN字段建议建立索引
    • 避免复杂的SQL语句
    • 避免where 1=1语句
    • 避免order by rand()类似写法

    八种经典优化方法

    • 选取合适的字段属性
    • 使用连接(JOIN)来代替子查询(Sub-Queries)
    • 使用联合(UNION)来代替手动创建的临时表
    • 事务
    • 锁定表
    • 使用外键
    • 使用索引
    • 优化的查询语句
      其他:http://t.csdnimg.cn/Sw8fj

    如何定位慢查询?

    慢查询

    通常是指执行时间较长的SQL查询语句,但是时间的界限因数据库和应用程序的不同而异

    如何定位

    1. 开启慢SQL统计:
    SET GLOBAL slow_query_log = on; //开启慢SQL统计开关
    
    • 1
    1. 设置判断为慢sql的阈值(单位秒):
    SET GLOBAL long_query_time = 1;
    
    • 1
    1. 设置日志位置:
    set global slow_query_log_file="D:\\slow.log";
    
    • 1

    性能分析

    • 使用explain关键字来对SQL进行性能分析,结果集包含一下参数
      在这里插入图片描述

    MySQL支持行锁还是表锁?分别有哪些优缺点?

    MySQL即支持行锁,也支持表锁,准确的说,应该是:InnoDB支持行锁和表锁;MyISAM不支持行锁

    行锁

    • 优点:
      • 锁定粒度最小
      • 发生锁冲突的概率最低
      • 并发度也最高
    • 缺点:
      • 行锁开销大
      • 加锁慢
      • 会出现死锁

    表锁

    • 优点:
      • 资源消耗比较少
      • 加锁块
      • 不会出现死锁
    • 缺点:
      • 触发锁冲突的概率最高
      • 并发度最低
  • 相关阅读:
    计算机毕业设计python基于django的少儿编程线上教育系统
    物联网毕业设计 - 基于单片机的静脉输液流速流量监测系统
    基于安卓android微信小程序美容理发店预约系统app
    Windows之应用安装程序 —— winget
    【问题排查】linux不重启应用释放被删磁盘空间的技术方案
    python高级在线题目训练-第二套·主观题
    Zookeeper中leader选举原理分析
    服务器掉包的原因及处理办法
    Docker常用命令
    量化投资00
  • 原文地址:https://blog.csdn.net/kukudeYSB/article/details/133895000