![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Mysql
文章平均质量分 95
遥不可及梦
这个作者很懒,什么都没留下…
展开
-
Mysql SQL分析优化
慢SQL诱因无索引、索引失效锁等待InnoDB支持行锁,MyISAM支持表锁InnoDB支持行锁更适合高并发场景,但行锁有可能会升级为表锁一种情况是在批量更新时行锁是基于索引加的锁,如果在更新操作时,条件索引失效,那么行锁会升级为表锁基于表锁的数据库操作,会导致SQL阻塞等待,影响执行速度在写大于读的情况下,不建议使用MyISAM行锁相对于表锁,虽然粒度更细,并发能力提升,但也带来了新的问题,那就是死锁不恰当的SQLSELECT *SELECT COUNT(*)原创 2020-10-29 15:49:04 · 285 阅读 · 0 评论 -
MySQL -- 数据恢复
DELETE使用DELETE语句误删除了数据行,可以使用Flashback通过闪回把数据恢复Flashback恢复数据的原理:修改binlog的内容,然后拿到原库重放。前提:binlog_format=ROW和binlog_row_image=FULL针对单个事务对于INSERT语句,将Write_rows event改成Delete_rows event对于DELETE语句,将Delete_rows event改成Write_rows event对于UPDATE语句,binlog里面记录了原创 2020-10-26 15:05:31 · 258 阅读 · 0 评论 -
MySQL -- KILL + 客户端
KILLKILL QUERY THREAD_ID 终止这个线程中正在执行的语句KILL [ CONNECTION ] THREAD_ID 断开这个线程的连接,如果该线程有语句在执行,先停止正在执行的语句锁等待表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL, `c` INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;INSERT INTO t VALUES (1,1);操作次序原创 2020-10-26 13:02:59 · 266 阅读 · 0 评论 -
MySQL 全表扫描
Server层-- db1.t有200GBmysql -h$host -P$port -u$user -p$pwd -e "select * from db1.t" > $target_file查询数据InnoDB的数据是保存在主键索引上,全表扫描实际上是直接扫描表t的主键索引获取一行,写到net_buffer中,默认为16K,控制参数为net_buffer_length重复获取行,直到写满net_buffer,然后调用网络接口发出去如果发送成功,就清空net_buffer,然后继原创 2020-10-10 16:04:39 · 1194 阅读 · 0 评论 -
Mysql Join
表的初始化CREATE TABLE `t2` ( `id` INT(11) NOT NULL, `a` INT(11) DEFAULT NULL, `b` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`)) ENGINE=InnoDB;DROP PROCEDURE IF EXISTS idata;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLA原创 2020-10-09 12:28:47 · 160 阅读 · 0 评论 -
MySQL JOIN优化
表初始化CREATE TABLE t1(id INT PRIMARY KEY, a INT, b INT, INDEX(a));CREATE TABLE t2 LIKE t1;DROP PROCEDURE idata;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i <= 1000) DO INSERT INTO t1 VALUES (i,1001-原创 2020-09-29 14:42:27 · 375 阅读 · 0 评论 -
MySQL 用户临时表
临时表 VS 内存表内存表,指的是使用Memory引擎的表,建表语法:CREATE TABLE … ENGINE=Memory。所有数据都保存在内存中,系统重启时被清空,但表结构还在临时表,可以使用各种引擎如果使用的是InnoDB或者MyISAM引擎,数据需要写到磁盘上当然也可以使用Memory引擎特征session Asession BCREATE TEMPORARY TABLE t(c int) ENGINE=MyISAM;(创建临时表)SHOW CR原创 2020-07-31 15:45:15 · 329 阅读 · 0 评论 -
MySQL 内部临时表
UNIONUNION语义:取两个子查询结果的并集,重复的行只保留一行表初始化CREATE TABLE t1(id INT PRIMARY KEY, a INT, b INT, INDEX(a));DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i<= 1000) DO INSERT INTO t1 VALUES (i,i,i); SET原创 2020-07-30 12:02:48 · 470 阅读 · 0 评论 -
MySQL Memory引擎
数据组织表初始化CREATE TABLE t1 (id INT PRIMARY KEY, c INT) ENGINE=Memory;CREATE TABLE t2 (id INT PRIMARY KEY, c INT) ENGINE=InnoDB;INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);INSERT INTO t2 VALUES (1,1),(2,2),(3,3),(4,4)原创 2020-07-28 18:15:25 · 471 阅读 · 0 评论 -
MYSQL 自增主键
自增不连续表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`)) ENGINE=InnoDB;```## 自增值```goINSERT INTO t VALUES (null,1,1);-- AUTO_INCREMEN原创 2020-07-27 12:38:52 · 409 阅读 · 0 评论 -
MySQL INSERT语句的锁
INSERT…SELECT表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`)) ENGINE=InnoDB;INSERT INTO t VALUES (null,1,1);INSERT INTO t VALUES (null原创 2020-07-22 21:40:45 · 461 阅读 · 0 评论 -
MySQL拷贝表
初始化CREATE DATABASE db1;USE db1;CREATE TABLE t(id INT PRIMARY KEY, a INT, b INT, INDEX(a)) ENGINE=InnoDB;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i <= 1000) DO INSERT INTO t VALUES (i,i,i);原创 2020-07-22 17:36:30 · 138 阅读 · 0 评论 -
MySQL权限
创建用户CREATE USER 'ua'@'%' IDENTIFIED BY 'pa';用户名+地址才表示一个用户,ua@ip1和ua@ip2代表的是两个不同的用户在磁盘上,往mysql.user表里插入一行,由于没有指定权限,所有表示权限的字段都是N在内存里,往数组acl_users里插入一个acl_user对象,该对象的access字段的值为0mysql> SELECT * FROM mysql.user WHERE user = 'ua'\G;******************原创 2020-07-21 12:05:59 · 205 阅读 · 0 评论 -
MySQL分区表
表初始化CREATE TABLE `t` ( `ftime` DATETIME NOT NULL, `c` int(11) DEFAULT NULL, KEY (`ftime`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(ftime)) (PARTITION p_2017 VALUES LESS THAN (2017) ENGINE = InnoDB, PARTITION p_20原创 2020-07-20 22:04:27 · 268 阅读 · 0 评论 -
MySQL 自增ID耗尽
显示定义ID表定义的自增值ID达到上限后,在申请下一个ID时,得到的值保持不变-- (2^32-1) = 4,294,967,295-- 建议使用 BIGINT UNSIGNEDCREATE TABLE t (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT=4294967295;INSERT INTO t VALUES (null);-- AUTO_INCREMENT没有改变mysql> SHOW CREATE TA原创 2020-07-20 21:01:31 · 365 阅读 · 0 评论 -
MySQL -- 空间回收
InnoDB的物理存储InnoDB表的组成:表结构(frm)+数据(ibd)MySQL 8.0开始,允许将表结构定义(占用空间很小)放在系统数据表中控制参数innodb_file_per_tableON:每个InnoDB表数据存储在一个以.ibd为后缀的文件中,推荐。更容易管理,DROP TABLE会直接删除这个文件OFF:InnoDB表数据存储在共享表空间,DROP TABLE,空间也是不会回收的SHOW VARIABLES LIKE '%innodb_file_per_table%原创 2020-07-20 10:01:33 · 506 阅读 · 0 评论 -
mysql幻读
表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;INSERT INTO t VALUES (0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);定义与原创 2020-07-16 18:07:36 · 132 阅读 · 0 评论 -
答疑文章(一):日志与索引相关问题读后总结
日志相关的问题:mysql 利用 binlog与redo log做 崩溃恢复。mysql利用了二阶段提交维护了主备数据一致性(PS:对mysql的崩溃恢复,以及异常数据恢复不是一样的情况需要注意)两阶段提交:取ID=2这一行 =》判断数据页是否在内存中,不在就从磁盘中读入内存中返回数据。=》将这一行的c值加1,写入新行=》新行更新到内存=》写入redo log处于prepare阶段。=》写...原创 2019-08-19 18:05:53 · 178 阅读 · 0 评论 -
普通索引与唯一索引,应该怎么选择?读后总结
在业务代码已经保证了不会写入重复的字段,那么尽量使用普通索引普通索引与唯一索引对比:在查询过程select id from t where k=5;从这条查询语句开始分析,分别分析k为普通索引时与唯一索引是的区别普通索引:在查到满足条件的记录,还需要继续往下查找。这里就用到了之前说的假设,业务已经保证了不会写入重复字段,否则查询次数与重复记录成线性增长。但是若不重复的情况。也就比唯一索引多...原创 2019-08-19 20:06:19 · 199 阅读 · 0 评论 -
order by 是怎么工作的?读后总结
order by 排序的两种模式全字段排序我们一般用explain命令查看sql是否使用排序。一般查看extra字段的描述。mysql会为每个线程分配一块内存用于排序 称为sort_buffer我们以这条sql查询为例select city,name,age from t where city=‘sz’ order by name limit 1000首先将满足条件的记录中的city...原创 2019-08-20 10:42:04 · 185 阅读 · 0 评论 -
为什么我的mysql会抖一下读后总结
“抖”:sql执行变慢了,随机出现,持续时间短。刷脏页的原因:innodb在更新数据的时候,更新内存,写redo log,(并没有将内存数据页同步到磁盘上)。这里引出两个概念:脏页 内存页与磁盘页数据不一致的内存页干净页 内存页与磁盘页数据一致的内存页flush脏页就是将内存页的数据更新到磁盘刷脏页的触发时机:redo log 写满了。flush脏页。内存不足,淘汰数据页,...原创 2019-08-15 19:16:25 · 161 阅读 · 0 评论 -
如何正确地显示随机消息?读后总结
背景:有个单词表,随机显示3个单词建表语句与初始化语句mysql> CREATE TABLE words (id int(11) NOT NULL AUTO_INCREMENT,word varchar(64) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB;delimiter ;;create procedure idata()b...原创 2019-08-21 10:23:05 · 279 阅读 · 0 评论 -
为什么表数据删除一半,表文件大小不变?读后总结
现象:删除了表数据,但是表文件大小不变针对的引擎是innodb表数据既可以放在共享表空间里,也可以是单独的文件。由innodb_file_per_table控制。off为将表数据放在系统共享表空间,on将表数据存储在一个.ibd为后缀的文件中。建议是将innodb_file_per_table设置为on。数据删除流程innodb数据是由b+树组织的,当我们删除某一条记录,引擎只将标记该...原创 2019-08-16 10:52:46 · 578 阅读 · 1 评论 -
为什么这些sql语句逻辑相同,性能却差异巨大读后总结
1.条件字段函数操作例子有一张日志表,查询 指定年限7月的记录总数mysql> CREATE TABLE tradelog (id int(11) NOT NULL,tradeid varchar(32) DEFAULT NULL,operator int(11) DEFAULT NULL,t_modified datetime DEFAULT NULL,PRIMARY KEY...原创 2019-08-22 09:23:01 · 282 阅读 · 0 评论 -
count()这么慢,我该怎么办读后总结
计算一个表的行数语句:select count(*) from t;innodb中这条语句的查询时间会随着表记录增加而增加。count()是实现方式count()是在引擎层面实现的,不同的引擎有不同的实现。1.MYISAM是将表的总行数存在磁盘上。count()会直接返回这个值,很高效,但是如果加上了where条件,也需要遍历。2.Innodb在执行count()的时候需要一行一行从引...原创 2019-08-19 10:04:17 · 4452 阅读 · 0 评论