![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
MySql进阶
文章平均质量分 69
以实战为线索,学习如何编写高性能sql
程序员小牧之
汲取,分享与成长,我们唯一能做的就是坚持。
展开
-
19.分布式事务编程
InnoDB存储引擎存储了对于XA事务的支持,并通过XA事务来支持分布式事务的实现。1.什么是分布式事务?分布式事务是指允许多个独立的事务资源(transactional resources)参与到一个全局事务的事务中,其中独立的事务资源可以理解为不同的数据库。全局事务要求在其中所有参与的事务要么都提交,要么都回滚,这对于事务原有的ACID要求又有了提高。注意:在使用分布式事务时,InnoDB存储引擎的事务隔离级别必须设置为SERIALIZABLE2.什么时XA事务?XA事务允许不同数据库之间的原创 2021-11-20 12:45:35 · 751 阅读 · 0 评论 -
18.事务的隔离级别
ANSI SQL标准定义的四个隔离级别分别为:READ UNCOMMITTED 读未提交:就是不同事务之间可以对数据是完全相互可见的,事务B可以见到事务A对某张表做的任何操作,在这种隔离性下的安全性非常低。READ COMMITTED 读已提交:事务A只能看到事务B提交后的操作。这种隔离级别下的安全性相比前者好一点。REPEATABLE READ 可重复读:目前MySQL InnoDB默认的事务隔离级别,在MySQL中已经完全具备ACID特性。SERIALIZABLE 串行化:安全级别最大,但性能原创 2021-11-20 12:39:40 · 813 阅读 · 0 评论 -
17.编写一个事务需要掌握的语法
在MySQL默认命令行设置下,事务都是自动提交的,这就意味着单独执行SQL后就会马上执行提交操作。如果我们要取消自动提交,我们可以采用两种方式:1).关闭自动提交设置在 MySQL 中,可以使用 SET autocommit 语句设置事务的自动提交模式,语法格式如下:SET autocommit = 0|1|ON|OFF;对取值的说明:值为 0 和值为 OFF:关闭事务自动提交。如果关闭自动提交,用户将会一直处于某个事务中,只有提交或回滚后才会结束当前事务,重新开始一个新事务。值为 1 和值原创 2021-11-17 21:02:16 · 533 阅读 · 0 评论 -
16.MySQL事务之事务的分类
我们都知道,事务是个好东西,好东西就会发展,发展就会壮大。随着事务的发展,事务的用法也分为几大类:扁平事务,带有保存点的事务,链事务,嵌套事务以及分布式事务等。下面对这几类事务进行学习1.扁平事务1)什么是扁平事务?扁平事务是最简单的事务,此类事务的所有操作都在同一层次上(同一数据库,同一回滚原则,要么都执行成功,要么都执行失败)。扁平事务的执行只存在三种状况:成功提交,人工回滚,外界原因强制终止。2)扁平事务实例我们先查询表t然后执行下面事务:START TRANSACTION;s原创 2021-11-10 22:01:57 · 951 阅读 · 0 评论 -
15.MySQL进阶之事务概述
1.什么是事务?从书上看:事务可由一条非常简单的SQL语句,也可以有一组复杂的SQL语句组成。简单说,事务就是SQL的集合。也许你会问:事务就是SQL的集合吗? 那它有一个sql脚本有什么区别?这里就涉及到事务的一个重要特性了:原子性。一个事务要么全部执行,要么全部不执行,不存在执行一部分,不执行一部分的情况,这就是它和sql脚本的区别,也就是说一个事务中的所有SQL,要么全部执行成功,要么全部执行失败。注意:原子性是事务的根本!!2.简单理解事务的ACID特性ACID其实是四个特性首字母。原创 2021-11-08 22:30:13 · 671 阅读 · 0 评论 -
14.子分区(复合分区)与分区中对NULL的处理
1.何为子分区?子分区顾名思义,就是在分区中再创建分区,达到对数据的细腻化操作。MySQL数据库中允许在RANGE和LIST的分区上再进行HASH分区或KEY分区。2.实例学习运行下面语句:CREATE TABLE ts( a int, b date)partition by range (year(b))subpartition by hash(to_days(b))subpartitions 2( partition p0 values less than (1原创 2021-10-29 19:49:17 · 193 阅读 · 0 评论 -
13.HASH分区,KEY分区,COLUMNS分区
1.何为HASH分区?故名思意,就是将列值通过特定的HASH函数计算后的值划分分区,HASH分区的目的是将数据均匀的分布到预先定义的各个分区中,保证数据均匀分布。我们要做的是基于将要被散列的列值指定一个列值或表达式,以及指定被分区的表将要被分割的分区数量。MySQL支持的HASH分区分为普通HASH分区和LINEAR HASH分区。2.普通HASH分区实例学习CREATE TABLE t_hash( a int, b datetime)partition by hash(yea原创 2021-10-29 19:39:09 · 1001 阅读 · 0 评论 -
12.LIST分区
1.何为LIST分区?LIST和RANGE分区唯一的区别就是,RANGE分区存储的值是连续的区间,而LIST分区存储的值是离散的。2.例子学习CREATE TABLE t( a int, b int )partition by list(b)( partition p0 values in(1,3,5,7,9), partition p1 values in(0,2,4,6,8));这表示p0分区只能存储b列为1,3,5,7,9的行数据。注意,它的用法原创 2021-10-28 18:27:13 · 1433 阅读 · 0 评论 -
11.RANGE分区
1.何为RANGE分区?顾名思义,范围分区,它是根据列值的范围进行分区的。2.实例学习首先,创建一张表,并为表新建范围分区:CREATE TABLE t( id INT)PARTITION BY RANGE(id)( PARTITION p0 VAlUES LESS THAN(10), PARTITION p1 VALUES LESS THAN(20));其中,建表语句后的:1)建表时的范围分区创建语句:PARTITION BY RANGE (id)(原创 2021-10-24 16:12:18 · 2040 阅读 · 1 评论 -
10.了解MySql中的分区概念
1.什么是分区?分区其实是一个过程,它将一个表或索引分解为多个更小,更容易管理的部分。MySQL支持的分区类型为水平分区:将同一张表中不同行的记录分配到不同的物理文件中。这样就可以根据分区对一些有规律的数据进行高效操作。MySQL数据库中的分区时局部分区,即一个分区中既存放数据也存放索引。2.MySql中支持的分区类型1)RANGE分区:行数据基于属于一个给定连续区间的列值放入分区。2)LIST分区:它和RANGE分区类型一样,只是LIST分区面向的是离散的值,而不是连续的列值。3)HASH分原创 2021-10-24 15:56:56 · 2314 阅读 · 0 评论 -
9.索引提示(INDEX HINT)
MySql支持索引提示(INDEX HINT)显式地告诉优化器使用那个索引。一般来说,下面两种情况需要用到索引提示:1)MySql错误的使用了某个索引从而导致SQL语句运行的非常慢。(这种情况非常少见,如果遇见了,就去买彩票吧)2)某些SQL语句可以选择的索引非常多,这时优化器选择执行计划时间的开销可能会大于SQL语句本身。 这时使用索引提示是有必要的。例如,优化器分析Range查询本身就是比较耗时的操作,这时DBA或开发人员分析最优的索引选择,通过INDEX HINT来强制让优化器直接选择指定的原创 2021-10-20 18:43:15 · 847 阅读 · 0 评论 -
8.覆盖索引
InnoDB存储引擎支持覆盖索引1)什么是覆盖索引?覆盖索引实际上就是辅助索引,当从辅助索引中就可以查到查询需要的数据而不用去查询聚集索引时,这时辅助索引也可被称为覆盖索引。下面回顾下辅助索引结构:辅助索引的叶子节点仅存放索引键值以及该索引键值指向的主键。2)使用覆盖索引的好处(提高查询速度)使用覆盖索引的好处就是辅助索引不包含整行记录的所有信息,所以查询起来相比于聚集索引会快很多。(在辅助索引层就返回结果!!)3)使用场景对于InnoDB存储引擎的辅助索引而言,由于其中包含了主键信息,因原创 2021-10-20 18:40:28 · 159 阅读 · 0 评论 -
7.联合索引(最左前缀原则)
1)什么是联合索引?联合索引指的是对一张表上的多个列进行索引。也就是说,表上多个列加起来组成一个索引,供快速查询使用。2)如何使用联合索引?首先,给表添加索引创建表时给表添加:CREATE TABLE t( a int, b int, primary key(a), key idx_a_b(a,b))创建表后给表添加:CREATE TABLE t( a int, b int, primary key(a))给表添加索引语句:A原创 2021-10-15 18:39:12 · 24324 阅读 · 6 评论 -
6.MySQL列Cardinality(基数)
1.什么是Cardinality?Cardinality中文译名为:基数。它在数据库中表示的意思就是数据库中某个表的某个列中不重复行的总个数。例如下表:t CREATE TABLE `t` ( `a` int(11) NOT NULL, `b` varchar(800) DEFAULT NULL, `c` int(11) NOT NULL, PRIMARY KEY (`a`), KEY `idx_c` (`c`)) ENGINE=InnoDB DEFAULT CHARSET=u原创 2021-10-13 17:23:26 · 5211 阅读 · 0 评论 -
5.MySql缓冲池学习
根据存储介质的不同,一般将数据库分为三种:1)基于磁盘的数据库系统(最慢)2)基于内存的数据库系统(最快,最贵)3)混合型数据库系统(折中选择)1.基于磁盘的数据库系统最为常见,比如Mysql, Oracle,SQL Server等数据库都是基于磁盘的数据库系统。毫无疑问,基于内存的数据库系统的访问速度非常之快,所以为了让内存在数据库中发挥作用,基于磁盘的数据库系统中存在一个机制:缓冲池1)何为缓冲池?就是一块内存区域,其作用是将磁盘上读取的指定大小数据(块),放入这个内存区域中,当再此查询原创 2021-10-04 18:27:57 · 903 阅读 · 0 评论 -
4.MySql进阶之查询处理(逻辑与物理)
重点:SQL语言的逻辑执行顺序和普通的编程语言不同,下面进行详细学习1.逻辑查询处理首先创建一张名为customers的表 CREATE TABLE `customers` ( `customer_id` varchar(10) NOT NULL, `city` varchar(10) NOT NULL, PRIMARY KEY (`customer_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_c原创 2021-09-30 16:01:36 · 404 阅读 · 0 评论 -
3.MySql进阶之使用分区
1.如何创建一个分区表使用分区的好处不用多说了,懂得都懂。1)如果想在创建表的时候创建分区我们可以如下写法:下面以时间日期分区CREATE TABLE test_partition(id int(11) not null ,tran_date date not null ,amt decimal(17,2) not null ,primary key(id,tran_date) //注意,如果想根据某个列分区,必须将此列加入主键中)partition by range(to_days(t原创 2021-09-29 15:03:38 · 334 阅读 · 0 评论 -
2.分析SQL和表的关键命令
1.EXPLAIN命令1)EXPLAIN SQL语句这个命令将为我们展示指定sql的查询执行计划,也就是,用它让mysql告诉我们它准备怎么执行这条语句。通过上面这些元素,我们可以清晰的了解mysql将如何执行这条sql,其中rows是大致将要扫描的行数,key表示用到的索引(null表示没用到索引)灵活使用这个命令分析sql语句是高效开发的关键:使用EXPLAIN命令分析查询sqlexplain select * from booktuijian where id=1;根据sql技巧将u原创 2021-09-25 16:46:33 · 191 阅读 · 0 评论 -
1.识别性能问题和优化查询
1.如何找到运行缓慢的SQL语句show full processlist命令其中\G是为了让输出结果垂直打印。这个命令将列出数据库历史操作中的语句的花费时间的倒叙排序。2.确认低效查询explain select * from tablename;假设第一步中确认了select * from tablename;花费了很长时间,我们就可以用上面的命令查看这个sql执行的一些细节。其中我们需要关注的是:rows的大小表示此次查询涉及的行数。 key表示所用的主键,null代表没使用。原创 2021-09-12 10:37:16 · 97 阅读 · 0 评论