MySQL查询执行过程
一条SQL语句执行的流程如下:
- 客户端连接 MySQL 服务器,发布查询
- 如果查询缓存中有结果,则直接返回结果
- 如果结果没有被缓存,则解析查询,并对通过优化器对查询进行优化
- 执行查询
MySQL数据类型
MySQL数据类型需要注意的是:
如果是字符型字符串(CHAR VARCHAR TEXT),指定的长度的则是字符数。如果是二进制类型(BINARY VARBINARY BLOB),指定的则是字节数。
查询基础
SELECT语法SELECT 是最常用的语句,上图给出了SELECT的语法。其中整理成常用的为:
SELECT
select_expr
[FROM table_refrence]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
查询表达式
可以看出 SELECT 后面跟的是 select_expr(查询表达式)。虽然大部分我们使用的是列名,但是实际上select_expr 可以是很多东西:
- 列名
select b.a from b
- 简单表达式
select 1 + 1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
- 函数
select IF(1=2, 0 , 1);
+-------------+
| IF(1=2,0,1) |
+-------------+
| 1 |
+-------------+
- 函数嵌套
select IF(1+IF(1=2,0,1)=2, 'YES','NO');
+---------------------------------+
| IF(1+IF(1=2,0,1)=2, 'YES','NO') |
+---------------------------------+
| YES |
+---------------------------------+
索引种类
索引种类在MySQL中,也存在一些情况无法使用索引:
- 索引需要遵守最左原则
- OR 前后存在未索引字段
- 优化器估计使用索引会比全盘扫描慢
- 负向查询(!=, not)不会使用索引
- 索引字段是表达式的一部分或函数的参数
- 索引选择性不高
执行顺序
- FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
- ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
- JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
- WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
- GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
- HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
- SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
- DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
- ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
- LIMIT: 取出指定行的记录,产生虚拟表VT11, 并将结果返回。
explain 意义
explain 意义Innodb 以及 MyISAM
- innodb 支持事务,MyISAM不支持事务
- innodb 支持行级锁,MyISAM支持表级锁
- innodb 支持外键, MyISAM不支持外键
- MyISAM 维护了具体行数
- MyISAM 支持全文索引
- MyISAM 是非聚集索引,innodb是聚集索引
- MyISAM 可以不设置主键
数据库锁
MyISAM
- 读锁: 加读锁时,其他事务不能加写锁,只能加读锁
- 写锁: 加写锁时,其他事务读写锁都不能加
总结即是读读不互斥,读写互斥,写读互斥
Innodb
- 共享锁: 与读锁类似
- 排他锁: 与写锁类似
网友评论