首页 > 数据库 >MySQL随笔

MySQL随笔

时间:2024-06-07 17:56:16浏览次数:33  
标签:事物 MySQL 查询 索引 使用 失效 随笔 主键

1、隔离级别

  innoDB通过间隙锁锁定查询范围避免被其他事物修改

  未提交读(导致脏读)、已提交读(导致不可重复读)、可重复读(mysql默认,导致幻读)、串行化 

  脏读:事物执行的过程读到其他事物未提交的数据  

  不可重复读:事物a在多次读取某数据时,事物b进行了修改,导致食物a两次读取结果不一样

  幻读:前后两次查询得到的结果不一样,事物前后两次查询统一范围数据时事物b进行了插入修改并提交

 

2、SQL优化

  a.增加索引;但是要避免索引失效如like、函数等

  b.避免返回不必要的数据列

  c.适当优化sql结构,如避免子查询、全表扫描等

  d.分库分表,单表数据量比较大时

  e.读写分离,读多写少时

 

3、索引失效情况

索引:主键索引、普通索引

使用ecplain 查询sql当前执行计划

  a 索引列上做函数运算导致失效

  b 组合索引需要按照最左匹配法则

  c 索引列存在隐式转换时候,即索引列是字符串类型但是没有加引号

  d 索引列使用不等号或者not查询导致失效

  e 使用like并且%加在前面时候失效,由于不符合最左匹配所以失效

  f 使用or但是语句前后没有同时使用索引的时候也会失效

 

4、update执行时如果where包含索引列且只执行一个语句,使用行锁,否则使用表锁

 

5、为什么索引不适用二叉树而使用B+树

二叉树每次插入大的值需要添加到右侧,深度较高,查一次就要进行一次IO,查找效率没有帮助。

红黑树也是最大的插到右侧,但是会进行自旋,不会全都加到一条线,相当于平衡二叉树,查找次数差不多能减少一半,但是深度还是比较高,而且自旋转也需要消耗资源。

B树一个节点可以存储多个元素,深度较低。

 B+树是对B树的一个增强,如图

 innoDB引擎:自增的在添加的时候不需要修改节点,节省时间

 

一般推荐建立一到两个的联合索引(复合索引)

Explain 命令中的 type 列,显示MySQL查询所使用的 关联类型(Join Types) 或者 访问类型,它表明 MySQL决定如何查找表中符合条件的行。
常见访问类型性能由最差到最优依次为:

ALL < index < range < ref < eq_ref < const < system。

 一般需要range级别或者达到ref级别

  range级别:

  1. 范围条件查询:在 WHERE 子句里带有 BETWEEN><>=<= 的查询。
  2. 多个等值条件查询:使用 IN() 和 OR ,以及使用 like 进行前缀匹配模糊查询

 

非主键索引的都可以称之为二级索引,二级索引是非聚集索引,没有在叶子结点包含全部的数据,只存主键的id,需要根据主键id进行回表再查询;

mysql5.6以后的索引下推可以减少回表

覆盖索引查询的字段都在索引列中,不需要进行回表所以效率高一些。

mysql表关联的底层实现原理:当数据量比较大的时候就算走索引也比较慢

 

explain关键参数type:

 

 

 

 

  

 

索引优化:

  • 全值匹配:使用复合索引时候,查询条件包括索引所有的列;
  • 索引列上少算数;使用函数没有办法根据有序性进行检索;
  • 范围索引后面会失效;前面使用有序范围后,后面的字段是无序的;如果第一个字段搜索范围小想强制使用索引可以加上关键字Force Index(索引名称)防止后面字段全表扫描
  •  尽量使用覆盖索引,不写星号(防止回表);explice查看extra显示index
  • 不等空值还有or,索引失效要少用,还有not in 、not exists也会失效,范围查询mysql自己判断
  • like百分号写右边;
  • 单引号不要省略

sql优化

  • 不要写*
  • 用小表驱动大表
  • 连接查询代替子查询;具体场景具体分析
  • 提升group by效率,分组字段添加索引
  • 批量插入优化,mybatis提供了sqlsession.getMapper(EmpMapper.class).insertBatch(数据list),五百以内
  • 使用limit
  • union all替代union 第一个不会去重,去重时需要遍历排序等内部操作
  • 尽量少关联

 

 

 

 

 

 

 

  

标签:事物,MySQL,查询,索引,使用,失效,随笔,主键
From: https://www.cnblogs.com/cikm/p/17943777

相关文章

  • mysql8 无法连接navicat问题
    1、修改MySQL的配置文件(my.cnf或者my.ini),在[mysqld]部分添加或者修改default_authentication_plugin=mysql_native_password。重启mysql服务2、创建或修改用户并设置密码:如果您还没有 root 用户从任何主机连接的权限,您需要首先以具有足够权限的用户(通常是本地 root 用户)登录......
  • MySQL中InnoDB引擎行数据过大对B+树存储的影响
    效率工具推荐一个程序员常用的工具网站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。小报童专栏精选Top100推荐一个小报童专栏导航站:小报童精选Top100(http://xbt100.top),收录了生财有术项目精选、A......
  • ubuntu 22.04 安装MySQL8后的基本设置
    安装sudoaptupdatesudoaptupgradesudoaptinstallapache2mysql-serverphplibapache2-mod-phpphp-mysql初始化配置MySQL初始化配置以及设置root密码初始化MySQL安全配置sudomysql_secure_installation这个命令会提示您进行一系列的安全设置,包括:是否......
  • 超级详细的mysql数据库安装指南
    如果你的电脑是windows,参考下面的安装步骤。一、下载mysql数据库进入MySQL官方网站(MySQLCommunityDownloads),按下图顺序点击“进入下载页面 在下载页面拉到最下面会看到下图中的安装软件 MSIInstaller注意有两个,这两个有什么区别呢?第一个(大小是10多M)是联网在线安装,会......
  • 谈谈Redis缓存中MySQL的数据如何与Redis同步
    在现代应用程序中,性能和响应速度是至关重要的。为了提高数据访问速度,常常会使用缓存技术。Redis作为一种高性能的内存数据库,常被用作缓存层,而MySQL则作为持久化存储层。如何有效地将MySQL数据与Redis缓存进行同步,是一个关键问题。本文将详细探讨Redis作为缓存时,http://ww......
  • 基于Java+SpringBoot+Mysql实现的协同过滤推荐旅游景点平台设计与实现
    一、前言介绍:1.1项目摘要随着人们生活水平的提高和休闲时间的增多,旅游已成为人们生活中不可或缺的一部分。然而,传统的旅游方式往往存在信息不对称、服务质量参差不齐、行程安排不够灵活等问题,给游客带来了诸多不便。与此同时,互联网技术的快速发展为旅游行业带来了革命性......
  • 基于Java+SpringBoot+Mysql实现的在线电影订票系统设计与实现
    一、前言介绍:1.1项目摘要在线电影订票系统的课题背景主要源于现代社会的信息化、网络化发展趋势以及人们对便捷、高效生活方式的追求。随着互联网技术的飞速发展和普及,人们的生活方式正在发生深刻的变化。在线购物、在线支付、在线预订等网络服务已经渗透到人们日常生活......
  • mysql 简单参数配置
    showglobalvariableslike'%timeout%';showglobalvariableslike'%buffer%'; innodb_buffer_pool_size=60Gwait_timeout=2400 showglobalvariableslike'%wait_timeout%';showglobalvariableslike'%innodb......
  • MySQL GROUP BY 用法介绍
    MySQL中GROUPBY用法简介GROUPBY语句用于结合合计函数,根据一个或多个列对结果集进行分组。可以把分组理解成Excel中的分组。把合计函数理解成Excel中的求和、求平均值等。语法SELECTcolumn1,column2,aggregate_function(column3)FROMtable_nameWHEREcon......
  • mysql 5.7以后需要设置安全导向
    //mysql_secure_installation安全配置向导[root@youxi1~]#mysql_secure_installationSecuringtheMySQLserverdeployment.Enterpasswordforuserroot://输入root密码The'validate_password'pluginisinstalledontheserver.Thesubsequentstepsw......