文章目录

  • 生猛干货
  • 官方文档
  • 利用索引优化锁
    • 为什么索引能优化锁
    • 演示
      • 无索引的情况 (获取不同的数据 发生了阻塞)
      • 有索引的情况 (获取不同的数据 未阻塞)
  • 搞定MySQL

生猛干货

带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试


官方文档

https://dev.mysql.com/doc/

如果英文不好的话,可以参考 searchdoc 翻译的中文版本

http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html


利用索引优化锁

为什么索引能优化锁

Innodb采用的行级锁,只有在修改行时才会对需要修改的行加锁。 但是这种情况只有在Innodb层过滤掉不需要的行是才有效。

如果存储引擎层不能过滤掉不需要的行,则需要在内存中锁定所有的行,在内存中进行过滤。

所以利用索引可以过滤掉不需要的数据, 使用索引的话,仅需要锁定被索引检索出来的数据,而不是锁定全部数据,从而达到优化锁的目的。

  • 索引可以减少锁定的行数
  • 索引可以加快处理速度,同时也加快了锁的释放

演示

举个例子 (演示锁, 肯定需要两个会话了)

无索引的情况 (获取不同的数据 发生了阻塞)

session 1 :

mysql> show create table actor \G
*************************** 1. row ***************************Table: actor
Create Table: CREATE TABLE `actor` (`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`actor_id`),KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)mysql> drop index idx_actor_last_name on actor ;  #Step1 先拿掉 last_name的索引
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> explain select * from actor where last_name = 'WOOD' \G;    #Step2  执行下执行计划
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: actorpartitions: NULLtype: ALL   --------------------> 全表扫描
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 200filtered: 10.00Extra: Using where  --------------------> 全表扫描后,通过where来过滤
1 row in set, 1 warning (0.00 sec)ERROR:
No query specifiedmysql> mysql> begin ;    #  Step3 开启事务
Query OK, 0 rows affected (0.00 sec)mysql> select * from actor where last_name = 'WOOD' for update ;  -----> Step4  通过for update ,加入一个排它锁
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|       13 | UMA        | WOOD      | 2006-02-15 04:34:33 |
|      156 | FAY        | WOOD      | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
2 rows in set (0.00 sec)mysql>
mysql> 

新开一个会话 session 2 :


行级锁,咋把willis 的查询也阻塞了呢? 就是因为没有索引 ,走了全表扫描,然后通过where 过滤。 把全表的数据都锁定了, 你查willis 自然也被阻塞了。 如果有索引的话,其实就仅仅会锁定 WOOD 对应的数据行。其他数据的操作都是可以的,我们接下来通过实验来验证下


有索引的情况 (获取不同的数据 未阻塞)

我们把会话一和会话二 ,rollback 掉。 然后把last_name的索引加上去,然后重新做下试验 。

会话一:

mysql>
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> create index idx_actor_last_name on actor(last_name);
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> explain  select * from actor where last_name = 'WOOD' \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: actorpartitions: NULLtype: ref
possible_keys: idx_actor_last_namekey: idx_actor_last_namekey_len: 182ref: constrows: 2filtered: 100.00Extra: NULL
1 row in set, 1 warning (0.00 sec)mysql> begin ;
Query OK, 0 rows affected (0.00 sec)mysql> select * from actor where last_name = 'WOOD' for update ;
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|       13 | UMA        | WOOD      | 2006-02-15 04:34:33 |
|      156 | FAY        | WOOD      | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
2 rows in set (0.00 sec)mysql> 

会话二:

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> begin ;
Query OK, 0 rows affected (0.00 sec)mysql> select * from actor where last_name = 'willis' for update;
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|       83 | BEN        | WILLIS    | 2006-02-15 04:34:33 |
|       96 | GENE       | WILLIS    | 2006-02-15 04:34:33 |
|      164 | HUMPHREY   | WILLIS    | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
3 rows in set (0.00 sec)mysql> 

可以看到,建立完索引后,会话二查询 willis 数据, 可以获取到结果, 因为会话一的事务中通过索引仅在内中锁定了WOOD对应的两条数据,其他数据是没有被锁定的。 ------》可以看到索引对锁的优化后, 增加了并发,提高DB的性能

当然了,你要是会话二和会话一查询的都是统一批数据,比如都是WOOD,因为会话一未提交, 会话二肯定会被阻塞的。 这里简单提一下。


搞定MySQL

MySQL-索引优化篇(3)_利用索引优化锁相关推荐

  1. MySQL-索引优化篇(2)_使用索引扫描来优化排序

    文章目录 生猛干货 官方文档 使用索引扫描来优化排序 索引的列顺序和Order By子句的顺序完全一致 索引中所有列的方向(升序.降序)和 order by子句完全相同 order by中的字段全部在 ...

  2. SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

    SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 原文:SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 前言 本篇继续玩转模块 ...

  3. Android进阶:性能优化篇 Android进阶:性能优化篇

    Android进阶:性能优化篇 分类:Android 性能优化2011-08-09 17:06585人阅读评论(0)收藏举报 一.在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现Ou ...

  4. Mysql—索引③:优化篇(不仅仅是索引)

    回顾数据库服务器优化的过程 关于数据库调优的知识点非常分散.不同的DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同. 虽然SQL查询优化的技术有很多,但是大方向上完全可以分成物理查询优 ...

  5. MySQL优化篇:单表索引失效

    文章目录 1.准备环境 2.全值匹配我最爱 2.最佳作前缀法则 3.不要在索引列上做任何计算 3.1 在查询列上使用了函数 3.2 在查询列上做了转换 4.索引列上不能有范围查询 5.尽量使用覆盖索引 ...

  6. MySQL-索引优化篇(4)_索引的维护

    文章目录 生猛干货 官方文档 删除重复索引 删除冗余索引 检查重复和删除的索引 pt-duplicate-key-checker 查找未被使用的索引 更新索引统计信息 索引碎片整理 搞定MySQL 生 ...

  7. MySQL-索引优化篇(1)_安装演示库 [前缀索引、联合索引、覆盖索引] explain参数

    文章目录 生猛干货 官方文档 安装演示数据库sakila 索引优化策略 索引列上不能使用表达式或者函数 前缀索引和索引列的选择性 前缀索引的创建 索引列的选择性 前缀索引的优缺点 联合索引 如何选择索 ...

  8. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

  9. MySQL怎么打开explain_MySQL干货之-利用EXPLAIN优化查询

    ​ 在工作中,经常会碰到一些慢查询,Explain可以帮我们更详细的了解MySQL查询的执行计划,用法也很简单Explain 后面跟上SELECT语句即可.执行完之后,会显示一行有多个列的记录,可能很 ...

最新文章

  1. 一起学WP7 XNA游戏开发(八. 让3d model动起来)
  2. MIT开发AI新工具,替设计师“省材料钱”:支持实时预览、兼容CAD软件丨开源...
  3. 大厂首发!java敏捷开发模式面试题
  4. xslt 标签取集合第一条数据_XSLT函数集合:数值函数、字符串函、节点集函数和布尔函数...
  5. Redis是如何写代码注释的?
  6. boost::fibers模块实现single stream的测试程序
  7. PHP程序员如何突破技术瓶颈
  8. Qt工作笔记-Qt移植到Linux上时提升窗口部件大小写问题(VS上存在的问题)
  9. xocodebulid 自动化打包 解决提示 ld: library not found for -lPods 问题
  10. 《设计模式——基于C#的工程化实现及扩展》
  11. jquery新版本旧版本之间的坑
  12. C语言入门——适合练手的密码本项目
  13. 【SVPWM】SVPWM算法推导及其Simulink仿真(二)
  14. [Hadoop培训笔记]05-HDFS详细分析(二)
  15. c# 标准正太分布函数_Excel里面标准正态分布函数NORMSDIST()在C#里的算法以及科学计数法转换为正常数值...
  16. c语言 函数拟合,曲线拟合成Y=a*(X^b)+c*(X^d)函数 - 数学 - 小木虫 - 学术 科研 互动社区...
  17. 云计算领域常见的一些专业术语、专有名词总结(一)
  18. 学习【菜鸟教程】【C++ 类 对象】【内联函数】(例子简单,评论难懂)
  19. 交互与前端13 Tabulator 表格实践
  20. “This probably means that you are not using fork to start your child processes and you hav报错

热门文章

  1. First Week :Linux系统学习
  2. visual studio 2019配置OnnxRuntime+推理+vgg16
  3. C++ static静态成员函数详解
  4. windows10上为jupyter notebook切换指定conda环境
  5. 数据可视化高级部分:如何使用轨迹地图对路径数据进行分析
  6. 样式文件修改后不起作用_Word样式,这个功能好用到让你忘不了!
  7. 深度学习100例 - 卷积神经网络(Inception V3)识别手语 | 第13天
  8. MATLAB某数组间隔取值
  9. softmax函数为什么叫softmax?
  10. Python编程基础:第三十节 文件检测File Detection