MySQL优化器对order by limit的错误处理分析
网上有很多案例是关于 order by limit 选择错误索引的文章。但每个人遇到的情况可能不太相同,有些在新版本的 MySQL 下已经修复了,有些是优化器估计一时半会处理不了的。 案例 MySQL order by limit 走错索引(range->indexscan) MySQL · 捉虫动态 · order by limit 造成优化器选择索……
MySQL联接查询算法(NLJ、BNL、BKA、HashJoin)
一、联接过程介绍 为了后面一些测试案例,我们事先创建了两张表,表数据如下: CREATE TABLE t1 (m1 int, n1 char(1)); CREATE TABLE t2 (m2 int, n2 char(1)); INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c')……
MySQL查询优化:Index Merge
一、为什么会有Index Merge? Index Merge 访问方法检索具有多个 range 扫描的行并将它们的结果合并为一个。这里的 range 就是 explain 中的 type: range。此访问方法简单来说就是对单个表的多个索引分别进行条件扫描,然后将它们各自的结果进行集合运算(Intersect/Union)。 MySQL 5.0之前,一个……
从顺序随机I/O原理来讨论MySQL MRR NLJ BNL BKA
一、机械磁盘原理 机械盘由动臂,盘片,读写磁头,主轴组成,磁头是固定不能动的,要读取相应的扇区只能通过盘片的旋转。每一个盘片为双面,每一个面上分布有同心圆的磁道,磁道又分为扇区一般为512 BYTES,现代的磁盘一般外边缘磁道的扇区多,内磁道的扇区少,那么一般读写外边缘磁道的速度更快,因为转速为定值。同时各个不同盘片上半径下同的磁道组成了一个柱面。 下图是一……
MySQL查询优化:子查询物化
一、背景 MySQL引入了Materialization(物化)这一关键特性用于子查询(比如在IN/NOT IN子查询以及 FROM 子查询)优化。 具体实现方式是:在SQL执行过程中,第一次需要子查询结果时执行子查询并将子查询的结果保存为临时表 ,后续对子查询结果集的访问将直接通过临时表获得。与此同时,优化器还具有延迟物化子查询的能力,先通过其它条件判断子……
MySQL查询解析顺序
一、逻辑查询处理 SQL语言不同于其他编程语言,最明显的不同体现在处理代码的顺序上。在大多数编程语言中,代码按编码顺序被处理。但在SQL语言中,第一个被处理的子句总是FROM子句。下面显示了逻辑查询处理的顺序以及步骤的序号。 (8) SELECT (9) DISTINCT <select_list> (1) FRO……
MySQL运算符介绍
运算符是告诉MySQL执行特殊算术或逻辑操作的符号,主要用于在SQL语句的WHERE子句来执行,比较和算术运算等操作。运算符用于指定一个SQL语句中的条件,并作为连词多个条件在一份声明中。MySQL的内部运算符很丰富,主要有四大类:算术运算符、比较运算符、逻辑运算符、位操作运算符。 一、算术运算符 运算符 作用 + 加法运算 –……
SQL编程:有趣的SQL语句–持续更新
一、统计每个表自增值 根据统计信息用来统计每个表自增字段当前使用量及自增最大值。 SELECT table_schema, TABLE_NAME, COLUMN_NAME, AUTO_INCREMENT, pow(2, CASE data_type ……
SQL编程:联接查询
一、联接查询 联结查询是一种常见的数据库操作,即在两张表(或更多表)中进行行匹配的操作。一般称之为水平操作,这是因为对几张表进行联接操作所产生的结果集可以包含这几张表中所有的列。对应于联接的水平操作,一般将集合操作视为垂直操作。 MySQL数据库支持如下的联接查询: CROSS JOIN(交叉联接) INNER JOIN(内联接) OUTER JOIN(外……
SQL编程:REPLACE INTO
REPLACE INTO 语句是 SQL 标准的 MySQL 扩展,它的功能就是要么直接插入一条新记录,要么删除旧的记录后再插入一条新的记录。 如果归纳一下 REPLACE INTO 语句的执行规则,基本会有以下几种情况: 当表没有主键和唯一键时,REPLACE INTO 相当于普通的 INSERT 操作;binlog 记录事件为 INSERT;返回影响行……
SQL编程:INSERT … ON DUPLICATE KEY UPDATE
向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是 insert Or Update 操作。这种控制可以放在业务层,也可以放在数据库层,大多数数据库都支持这种需求,如本文所讲的 MySQL 中的INSERT ... ON DUPLICATE KEY UPDATE语句。 该语句是基于唯一索引或主键使用,比如一个……
MySQL索引原理及SQL优化
MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少……