mysql是过程化的语⾔吗_MySql语句执⾏过程(从结构看优
化)
逻辑查询步骤
查询操作是关系数据库中使⽤最为频繁的操作,也是构成其他MySQL语(如DELETE、UPDATE)的基础。查询处理的顺序如下:
(7) SELECT (8) DISTINCT
(1) FROM
printf函数中大小写d通用吗(3) JOIN
(2) ON
(4) WHERE
(5) GROUP BY
(6) HAVING
(9) ORDER BY
(10) LIMIT
并非所有变量都已绑定怎么解决1)FROM:对FROM⼦句中的左表和右表执⾏笛卡⼉积(Cartesian product),产⽣虚拟表VT1。
2)ON:对虚拟表VT1应⽤ON筛选,只有那些符合的⾏才**⼊虚拟表VT2中。
3)JOIN:如果指定了OUTER JOIN(如LEFT OUTERJOIN、RIGHT OUTER JOIN),那么保留表中未匹配的⾏作为外部⾏添加到虚拟表
VT2中,产⽣虚拟表VT3。如果FROM⼦句包含两个以上表,则对上⼀个连接⽣成的结果表VT3和下⼀个表重复执⾏步骤1)~步骤3),直到处理完所有的表为⽌。
4)WHERE:对虚拟表VT3应⽤WHERE过滤条件,只有符合的记录才**⼊虚拟表VT4中。此时数据还没有分组,所以不能在where中出现对统计的过滤
学生个人博客制作html5)GROUP BY:根据GROUP BY⼦句中的列,对VT4中的记录进⾏分组操作,产⽣VT5。在GROUP BY阶段,数据库认为两个NULL值是相等的,因此会将NULL值分到同⼀个分组中。
6)CUBE|ROLLUP:对表VT5进⾏CUBE或ROLLUP操作,产⽣表VT6。
mysql语句顺序7)HAVING:对虚拟表VT6应⽤HAVING过滤器,只有符合的记录才**⼊虚拟表VT7中。count(expr) 会返回expr不为NULL的⾏
数,count(1)、count(*)会返回包括NULL值在内的所有数量
8)SELECT:第⼆次执⾏SELECT操作,选择指定的列,插⼊到虚拟表VT8中。
9)DISTINCT:去除重复数据,产⽣虚拟表VT9。
10)ORDER BY:将虚拟表VT9中的记录按照进⾏排序操作,产⽣虚拟表VT10。如果不指定排序,数据并⾮总是按照主键顺序进⾏排序的。NULL被视为最⼩值
11)LIMIT:取出指定⾏的记录,产⽣虚拟表VT11,并返回给查询⽤户。LIMIT n, m的效率是⼗分低的,⼀般可以通过在where条件中指定范围来优化 where id> ? limit 10
物理查询
数据库也许并不会完全按照逻辑查询处理的⽅式来进⾏查询,MySQL数据库层有Parser和Optimizer两个组件。Parser的⼯作就是分析SQL 语句,⽽Op-timizer的⼯作就是对这个SQL语句进⾏优化,选择⼀条最优的路径来选取数据,但是必须保证物理查询处理的最终结果和逻辑查询处理是相等的。
Explain语句简介
explain命令是查看查询优化器(Optimizer)是如何执⾏查询语句的。
explain输出字段
id
select_type
table
type
chrome浏览器安装包possible_keys
key
key_len
ref
rows
小学信息技术编程软件Extra
id
id值越⼤优先级越⾼,越先被执⾏。id相同时,执⾏顺序由上⾄下。
select_type
**:意味着查询不包括⼦查询和union
PRIMARY:查询中若包含任何复杂的⼦部分,最外层的select被标记为PRIMARY
SUBQUERY: 包含在SELECT列表中的⼦查询中的SELECT(不在From字句中)
DERIVED:包含在FROM⼦句的⼦查询中的SELECT,MySQL会递归执⾏并将结果放到⼀个临时表中。
UNION: UNION中的第⼆个或后⾯的SELECT语句,UNOIN中的第⼀个SELECT显⽰为PRIMARY。
UNION RESULT:⽤来从UNION的匿名临时表检索结果的SELECT被标记为UNION SELECT。
table
显⽰这⼀⾏数据正在访问哪张表,若在查询中为select起了别名,则显⽰别名,如果为(x是个数字,可以理解为第⼏步执⾏的结果)
type
ALL: 全表扫描,MySQL将遍历全表以到匹配的⾏。
index: 跟ALL⼀样,只是扫描全表时按索引次序进⾏,与ALL相⽐主要优点是避免了排序。
range: 有限制的索引扫描,带有BETWEEN 或在WHERE字句中带有>、
ref: 索引查,查索引匹配某个单值的所有⾏(当索引为⾮唯⼀性索引时)。
eq_ref: 类似ref,区别就在使⽤的索引是唯⼀索引,对于每个索引键值,表中只有⼀条记录匹配,简单来说,就是多表连接中使⽤primary key或者 unique key作为关联条件。
const、system: const⽤于⽤常数值⽐较PRIMARY KEY或UNIQUE索引的所有部分时,system是const类型的特例,当查询的表只有⼀⾏的情况下,使⽤system。
NULL: MySQL在优化过程中分解语句,执⾏时甚⾄不⽤访问表或索引,例如从⼀个索引列⾥选取最⼩值可以通过单独索引查完成。
possible_keys
查询可以使⽤哪些索引。
keys
MySQL实际采⽤哪个索引。
key_len
表⽰索引中使⽤的字节数,可通过该列计算查询中使⽤的索引的长度(key_len显⽰的值为索引字段的最⼤可能长度,并⾮实际使⽤长度,即key_len是根据表定义计算⽽得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
ref
使⽤哪个列或常数与key⼀起从表中选择⾏。
rows
MySQL估计为了到所需的⾏⽽要读取的⾏数。
Extra
Using index: 从索引中就可以查询到最终需要的信息,不需要再读取表。
Using temporary: 表⽰MySQL需要使⽤临时表来存储结果集,常见于排序和分组查询
Using filesort: MySQL中⽆法利⽤索引完成的排序操作称为”⽂件排序”
原⽂来⾃:shanks’s blog
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论