通常我们在做这个选择的时候,考虑得最多的应该是如果我们需要让 Database MySQL 来帮助我们从数据库层面过滤掉对应字段的重复数据我们会选择唯一索引,如果没有前者的需求,一般都会使用普通索引.这篇文章将会站在性能的角度来分析一下两者的区别对性能的影响. 这里还是用一张之前分析索引用到的图. 查询过程 在我们查询的时候我们使用 select id from T where k=5.这个查询语句通过查询逐渐搜索到 B+Tree 的叶子节点,然后取到对应的数据页,然后在数据页内部找到对应记录.…
我记得之前博客我也写过关于索引使用的文章,但是并不全面,这次尽量针对重点铺全面一点. 因为索引是数据引擎层的结构我们只针对最常见使用的 Innodb 使用的 B+Tree 搜索树结构进行介绍. 每一个在 InnoDB 的中的索引都对应一颗 B+Tree.举个栗子: 创建这样一个表,并且在字段 k 上创建索引 mysql> create table T( id int primary key, k int not null, name varchar(16), index (k))engine=I…
索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询.5.1 索引基础 在MySQL中,存储引擎首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行. 索引可以包含一个或多个列的值.如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列. 5.1.1 索引的类型 索引有很多类型,可以为不同的场景提供更好的性能.在MySQL中,索引是在储存引擎层而不是…
看了非常多 MySQL 相关的书籍和文章,没有看到过如此优秀的专栏.所以未来一段时间我会梳理读完该专栏的所学所得. 当我们在执行该查询语句的时候我们在干什么 mysql> select * from T where ID=10: 让我们先来看一个架构示意图 MySQL 架构被清晰的分为了两层,服务器层 | 存储引擎层. 服务器层一般用于存放一些可以跨存储引擎执行的功能,Server 层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日…
针对排序来说,order by 是我们使用非常频繁的关键字.结合之前我们对索引的了解再来看这篇文章会让我们深刻理解在排序的时候,是如何利用索引来达到少扫描表或者使用外部排序的. 先定义一个表辅助我们后面理解 CREATE TABLE `t` ( `id` ) NOT NULL, `city` varchar() NOT NULL, `name` varchar() NOT NULL, `age` ) NOT NULL, `addr` varchar() DEFAULT NULL, PRIMARY…
开始今天读书笔记之前我觉得需要回顾一下当我们在更新一条数据的时候做了什么. 因为 WAL 技术的存在,所以当我们执行一条更新语句的时候是先写日志,后写磁盘的.当我们在内存中写入了 redolog 之后,就返回已经更新成功了.后续通过其他的手段将数据写回到磁盘上. 当内存数据也跟磁盘数据页不一致的时候,我们就称这个内存页为“脏页”.内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”. 有几种场景会让 MySQL 主动将 redo log 里面的记录刷到实际的数据更新上面. 1…
这篇我觉得有点难度,我会更慢的更详细的分析一些 case . MySQL 的默认事务隔离级别和其他几个主流数据库隔离级别不同,他的事务隔离级别是 RR(REPEATABLE-READ) 其他的主流数据库比如 oracle 通常是 RC(READ-COMMITTED) 关于数据库有哪些隔离级别我这里就不详细阐述了,大概是什么特性我这里就不阐述了大家可以自行翻阅资料,让我们聚焦这两个最重要的隔离级别在一些查询更新的时候会出现什么样的特性表达. 当我们使用 RR 的时候,事务启动的时候会创建一个视图…
全局锁 全局锁是针对数据库实例的直接加锁,MySQL 提供了一个加全局锁的方法, Flush tables with read lock 可以使用锁将整个表的增删改操作都锁上其中包括 ddl 语句,只允许全局读操作. 全局锁的典型使用场景是做全库的逻辑备份. 不过现在使用官方自带工具 mysqldump 使用参数 --single-transaction 的时候,导出数据之前就会启动一个事务.来确保拿到一致性视图.这个应该类似于在可重复读隔离级别下启动一个一致性事务.由于 MVCC 的支持,这个…
上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍mysql中最简单快速的优化方法——添加索引. 一.索引的添加                                                                              mysql一共有四类索引,分别是主键索引.唯一索引.普通索引以及全文索引. 1.1.主…
在C#中,可以在类.结构或接口中用this关键字声明索引器,在索引器内部用get或set访问器访问类中集合的某项值.因此可以将索引器看作是类的属性一样去定义.索引器常用定义格式如下: public int this[int index]{ get{ return 类内部的某个集合[index];} set{类内部的某个集合[index]=value;} } 索引器参数类型不只是整型,还可以用字符串,例如 public int this[string index]{.....}这样的格式. 今天所…