Mysql
文章平均质量分 91
mysql相关内容
懒人猿
这个作者很懒,什么都没留下…
展开
-
为什么我的MySQL会“抖”一下?
一条sql语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只是随机,而且持续时间还很短。SQL语句为什么变慢了在前面的日志系统:一条SQL更新语句是如何执行的?文章中,介绍了WAL机制。InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。这个操作叫作redo log(重做日志),也就是酒店掌柜用来记账的粉板,在更新内存写完redo log后,就返回给客户端,本次更新成功。做下类比可以知道,掌柜记账的账本就是数据文件,记账用的粉板是日志文件(原创 2021-11-08 16:58:59 · 68 阅读 · 0 评论 -
怎么给字符串字段加索引?
在使用邮箱登录的时候,怎么在邮箱这样的字段上建立合理的索引?假如,现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64),...)engine=innodb; 在使用邮箱登录的时候,在业务代码中一定会出现类似于这样的语句:select f1,f2 from SUser where email = 'xxx';如果email这个字段上没有原创 2021-11-08 16:55:19 · 317 阅读 · 0 评论 -
Mysql为什么有时候会选错索引?
在Mysql中一张表其实是可以支持多个索引的。但是,在写sql的时候,并没有主动指定使用哪个索引,也就是说,使用哪个索引是由mysql来确定的。有时候会出现这种情况,一条本来可以执行得很快的sql语句,但是因为mysql选错了索引,而导致执行速度变得很慢。有如下一张表,并且对a、b字段建立索引:CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRI原创 2021-05-26 17:58:54 · 117 阅读 · 0 评论 -
普通索引和唯一索引,应该怎么选择?
在不同的业务场景下,应该选择普通索引,还是唯一索引?每个人都有一个唯一的身份证号,在业务代码中已经保证了不会写入两个重复的身份证号。如果需要按照身份证号查姓名,就会执行类型这样的sql语句:select name from user where id_card = '********************'所以,一定会考虑在id_card字段上建立索引。由于身份证号字段较大,不建议把身份证号当作主键,那么,现在有两个选择,一、给id_card字段创建唯一索引,要么创建一个普通索引。如果业务代码已原创 2021-03-17 14:11:59 · 144 阅读 · 0 评论 -
事务到底是隔离的还是不隔离的?
这篇文章在讲解的时候,如果没有特殊说明,都是默认autocommit = 1;如果是可重复读隔离级别,事务T启动的时候会创建一个视图 read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,在行锁的时候,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。那么问题来了,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的原创 2021-03-09 11:50:44 · 99 阅读 · 0 评论 -
行锁功过:怎么减少行锁对性能的影响?
mysql的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之一。行锁就是针对数据表中行记录的锁。比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新。数据库中还有一些没那么一目了然的概念和设计,这些概念和设计如果理解和使用不当原创 2021-03-09 11:43:14 · 107 阅读 · 0 评论 -
全局锁和表锁
数据库锁涉及的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,mysql里面的锁大致可以分为全局锁,表级锁,行锁全局锁全局锁就是对整个数据库实例加锁。mysql提供了一个加全局读锁的方法,命令时Flush tables with read lock(FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(增删改),数据定义语句(建表、原创 2021-03-09 11:41:43 · 52 阅读 · 0 评论 -
深入浅出索引(下)
执行select * from T where k between 3 and 5 需要执行几次树的搜索操作,会扫描多少行?mysql> create table T (ID int primary key,k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '',index k(k))engine=InnoDB; insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'原创 2021-03-09 11:38:45 · 57 阅读 · 0 评论 -
深入浅出索引(上)
索引的出现其实就是为了提高数据查询的效率,就像书的目录一样索引的常见模型常见的也比较简单的可以用于提高读写效率的数据结构:哈希表、有序数组、搜索树哈希表:是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。 不可避免的,多个key值经过哈希函数的换算,会出现同一个值得情况。处理这种情况的一种方法是,拉出一个链表。**哈希原创 2021-03-09 11:30:29 · 102 阅读 · 1 评论 -
事务隔离:为什么你改了我还看不见?
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在Mysql中,事务支持是在引擎层实现的。Mysql是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如Mysql原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一隔离性和隔离级别事务特性:有ACID(Atomicity、Consistency、Isolation、Durability,即原子性,一致性,隔离性,持久性)当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复原创 2021-02-06 10:23:03 · 64 阅读 · 0 评论 -
日志系统: 一条sql更新语句是如何执行的
从一个表的一条更新语句说起,表的创建语句如下:create table T(ID int primary key, c int);这个表有一个主键ID和一个整形字段c如果要将ID=2这一行的值增加1,sql语句就会这么写:update T set c=c+1 where ID = 2;首先,查询语句的那一套流程,更新语句也是同样会走一遍和查询流程不一样的是,更新流程还涉及两个重要的日志模块,即redo log(重做日志)和binlog(归档日志)。redo log(物理)日志模块如果每一原创 2021-01-29 11:12:31 · 123 阅读 · 3 评论 -
一条sql查询语句是如何执行的
一、mysql分为server层跟存储引擎server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖mysql的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持InnoDB(默认、常用)、MyISAM、Memory等多个存储引擎在create table语句中使用engine=memory,来指定使用内存引擎创建表,不同存储引擎的表数据存期方式不同原创 2021-01-29 11:08:24 · 72 阅读 · 0 评论