SQL【更新中】
SQL技巧+工作经验
努力的SIR
你只管努力,其他的交给天意。
展开
-
论MySQL行锁的功与过
对于不支持行锁的引擎,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。课后问题:...原创 2021-05-27 16:20:53 · 229 阅读 · 1 评论 -
全局锁和表锁
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。课后问题:Q1:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;Q2:START TRANSACTION WITH CONSISTENT SNAPSHOT;/* other tables */Q3:SAVEPOINT sp;/* 时刻 1 */Q4:show create table `t1`;/* 时刻 2 */Q5:SELECT原创 2021-05-27 15:31:33 · 203 阅读 · 0 评论 -
深入浅出索引
三种常见的索引数据结构,它们分别是哈希表、有序数组和搜索树。哈希表这种结构适用于只有等值查询的场景有序数组在等值查询和范围查询场景中的性能就都非常优秀,但是,有序数组索引只适用于静态存储引擎二叉搜索树也是课本里的经典数据结构思考问题1:思考问题2:...原创 2021-05-25 19:02:06 · 159 阅读 · 0 评论 -
事务隔离
原创 2021-05-25 15:56:52 · 133 阅读 · 0 评论 -
一条SQL更新语句的执行过程
经典SQL更新语句:mysql> create table T(ID int primary key, c int);mysql> update T set c=c+1 where ID=2;有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。注意redo log的两阶段提交。...原创 2021-05-25 15:23:25 · 100 阅读 · 0 评论 -
一条SQL查询语句的执行过程
经典SQL查询语句mysql> select * from T where ID=10;大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等原创 2021-05-24 20:35:05 · 97 阅读 · 0 评论 -
一文了解SQL子查询
补充:什么是Semi-JOIN?A表在B表找到匹配的记录之后,半连接(Semi-JOIN)返回A表中的记录。与连接查询不同,即使B表中找到多条匹配的记录,A表也只会返回一条记录。另外,B表一条记录也不会返回。半连接通常使用IN 或 EXISTS 作为连接条件。...原创 2021-05-23 16:23:43 · 128 阅读 · 0 评论 -
再谈MySQL索引
B+Tree的优势在哪儿?如何查看索引使用情况?原创 2021-05-20 15:56:23 · 75 阅读 · 0 评论 -
SQL语句LEFT JOIN中的ON和WHERE
SQL语句:FROM A LEFT JOIN B and A.ID=B.ID and A.name=‘XXX’不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。基本表信息如下:SQL1:返回结果依旧是14 rows,区别是非CLERK显示为NULLSQL3:返回相同行数...原创 2021-05-19 21:20:23 · 111 阅读 · 0 评论 -
浅谈MySQL中的高性能索引
InnoDB中创建自定义哈希索引在B-Tree上自定义hash索引,还是使用B-Tree进行查找,但是它使用哈希值而不是键本身进行索引查找。如果我们需要存储大量的url,并根据url进行搜索查找,因为url很大的字符串会导致查询语句很慢。1.删除原来URL列上的索引,而新增一个被索引的url_crc的列,同时使用crc32做哈希; 此时是通过整数而不是url字符串进行索引比较,因此性能会非常高。SELECT ID FROM url WHERE url_crc=CRC32("http://www原创 2021-01-18 20:16:51 · 113 阅读 · 0 评论 -
MySQL中的SERIALIZABLE浅谈
SERIALIZABLE隔离级别:一个个事务排成序列的形式。事务一个挨一个执行,等待前一个事务执行完,后面的事务才可以顺序执行。在SERIALIZABLE级别下,不会使用MySQL的MVCC机制,而是在每一个SELECT请求下获得读锁,在每一个UPDATE操作下尝试获得写锁。开启事务A和B,修改隔离级别,不自动提交事务:事务A中,查看pay表如下:事务B中,查看pay表如下:(两个事务都可以正常执行)此时,在A中执行INSERT或者UPDATE操作:(均被阻塞)COMMIT事务B之后,A如原创 2021-01-20 15:04:26 · 1414 阅读 · 0 评论 -
MySQL中的Repeatable-Read探讨
在客户端A中,做以下操作:在客户端B中,修改id=1的记录,然后提交:再回到客户端A中,发现id=1的记录并没有改变:紧接着,在A中执行UPDATE语句,发现是从400的基础上进行修改的,数据一致性没有被破坏。可重复读的隔离级别下使用了MVCC机制,SELECT操作不会更新版本号,会读历史版本属于快照读(历史版本);INSERT、UPDATE和DELETE会更新版本号,会读最新版本属于当前读(当前版本)。在B中INSERT数据:(先COMMIT事务A,再重新开启一个事务A)先看A:操作原创 2021-01-19 16:23:50 · 642 阅读 · 0 评论 -
SELECT FOR UPDATE语句
悲观锁实现:以下实例使用MySQL官方数据库sakila--关闭自动提交事务SET autocommit=0;--city表中city_id的行数据会被锁定,其它的事务必须等本次事务提交之后才能执行。START TRANSACTION;SELECT * FROM city WHERE city_id=1 FOR UPDATE;SELECT sleep(10);COMMIT;NOTE:只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 相同数据时会等待其它原创 2021-01-19 09:54:19 · 914 阅读 · 0 评论 -
Schema与数据类型优化
关于整数类型:1.整数类型都有可选的UNSIGNED,表示不允许负值。2.为整数类型指定显示宽度是没有意义的,只会控制客户端显示字符的个数。关于实数类型:1.不精确类型:FLOAT,DOUBLE; 精确类型:DECIMAL2.CPU不支持对DECIMAL进行直接运算,可以直接对浮点进行运算;同时,DECIMAL会占用更多的空间,MySQL将数字打包 保存到一个二进制字符串中,每4个字节存储9个数字。3.可以使用BIGINT代替DECIMAL,放大对应倍数即可。CHAR类型的优点:1.原创 2021-01-18 14:23:31 · 113 阅读 · 0 评论 -
CREATE TABLE标准
以MySQL的sakila数据库中的city表为例,探讨建表语句:CREATE TABLE `city` ( `city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `city` varchar(50) NOT NULL, `country_id` smallint(5) unsigned NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP原创 2021-01-12 15:18:28 · 224 阅读 · 0 评论 -
MySQL慢查询日志浅谈
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的SQL语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。慢查询日志相关参数:slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭。slow-query-log-file:MySQL数据库慢查询日志存储路径。long_query_time:慢查询阈值,当查询时间多于设定的阈值时,记录原创 2021-01-12 10:19:09 · 206 阅读 · 0 评论 -
浅谈InnoDB和MyISAM主要对比
① 事务如果应用需要事务支持,那么InnoDB是最稳定的选择。如果不需要事务支持,且主要是SELECT和INSERT操作,那么MyISAM也是不错的选择。② 锁粒度MyISAM支持表级锁定。InnoDB支持行级锁,但是InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。③ 并发InnoDB采用MVCC来支持高并发,并且实现了4个隔离型级别。在REPEATABLE READ下,通过间隙锁防止幻读的出现。MVCC理解为行级锁的变种,但原创 2021-01-09 18:04:34 · 216 阅读 · 1 评论 -
MySQL窗口函数
序号函数row_number() 无间断,重复值时不并列rank() 有间断,重复时并列dense_rank() 无间断,重复时并列分布函数注意code中窗口函数的方法,当一个select语句中有多个窗口函数时很方便。前后函数头尾函数其他函数此函数在数据分析中应用较多,比如由于数据量大,需要将数据平均分配到N个并行的进程分别计算,此时就可以用NFILE(N)...原创 2020-01-13 09:16:53 · 271 阅读 · 0 评论 -
重新理解开窗函数
select deptno, count(*) from empgroup by deptno;输出结果:select deptno, count(*) over()from empgroup by deptno;输出结果:select deptno, count(*) over()from emp;输出结果:通过这个例子,体会开窗函数的强大:select ...原创 2020-01-03 15:26:36 · 309 阅读 · 0 评论 -
MySQL练习题
use bjpowernode;-- 1 取得每个部门最高薪水的人员名称select a.ename,a.sal,a.deptno from emp a join(select deptno, max(sal) 最高工资 from emp group by deptno) bon a.deptno=b.deptno and a.sal=b.最高工资;-- 2 哪些人的薪水在部门平均薪水...原创 2019-09-24 16:29:55 · 280 阅读 · 0 评论 -
数据库使用规范
关于表【强制】表和列的名称必须控制在32个字符以内,表名只能使用字母、数字和下划线,一律小写。【强制】创建表时必须显式指定字符集为utf8或utf8mb4。【强制】建表必须有comment。【强制】要求主键为id,类型为int或bigint,且为auto_increment 建议使用unsigned无符号型。【建议】表中所有字段尽量都是NOT NULL属性,业务可以根据需要定义DEFA...原创 2019-10-05 10:17:57 · 293 阅读 · 0 评论 -
面试官:聊一下你对MySQL索引实现原理?
可以看到,不管怎么变化,B+树总是会保持平衡。但是为了保持平衡,对于新插入的键值可能需要做大量的拆分页(split)操作,而B+树主要用于磁盘,因此页的拆分意味着磁盘的操作,应该在可能的情况下尽量减少页的拆分。因此,B+树提供了旋转(rotation)的功能.个人理解:当我们使用辅助索引查找数据时, 首先通过辅助索引找到 主键位置, 再通过聚集索引取出数据.(数据存储在聚集索引的叶...原创 2019-11-07 15:04:05 · 202 阅读 · 0 评论 -
Mysql笔记之彻底看懂Explain语句
explain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。作用1、表的读取顺序2、数据读取操作的操作类型3、哪些索引可以使用4、哪些索引被实际使用5、表之间的引用6、每张表有多少行被优化器查询S...原创 2019-11-06 14:39:23 · 247 阅读 · 0 评论 -
在SQL中正确认识 case函数
业务场景:要求按每个年级统计男生和女生的数量各是多少,统计结果的表头为,年级,男生数量,女生数量。数据准备:CREATE TABLE example( id VARCHAR(20), name VARCHAR(20), birthday VARCHAR(20), sex VARCHAR(3), grade VARCHAR(20)); INSERT INTO `examp...原创 2019-11-05 16:13:27 · 144 阅读 · 0 评论 -
MySQL中Explain语句中KEY_LEN的计算方法
规则1. 所有的索引字段,如果没有设置not null,则需要加一个字节。2. 定长字段,int占四个字节、date占三个字节、char(n)占n个字符。3. 对于变成字段varchar(n),则有n个字符+两个字节。4. 不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。注意上面规...原创 2019-10-24 14:17:08 · 169 阅读 · 0 评论