使用索引的原则sql
使用索引须要注意如下几点:数据库
3.在组合索引上要注意最左原则express
咱们想要知道咱们的sql语句写的好很差,怎么来判断?测试
咱们先说下sql语句是怎么执行的,举个例子ui
select u.name i.expression from user u left join userinfo i on u.id=i.uid where u.id in (1,3,4,55,67,76) order by u.id limit 10;排序
这条sql语句,会先执行哪一块? 执行的原理是什么?索引
select u.name i.expression from user u left join userinfo i on u.id=i.uid where u.id in (1,3,4,55,67,76) order by u.id limit 10;it
sql语句执行的逻辑是这样的
第一步: 将user表和 userinfo表 作笛卡尔积
1.FROM 子句对其后面的左表user和右表执userinfo行笛卡尔积, 产生虚拟表VT1io
2.ON 子句对VT1中的数据根据ON的条件进行过滤,产生虚拟表VT2
问题:怎么过滤的?原理
3.JOIN子句 将未符合条件的保留表中的数据添加都VT2中,造成VT3
4.WHERE子句 对VT3中的数据进行WHERE条件过滤,造成VT4
5.GROUP BY 子句对VT4中的数据进行分组操做,而后造成VT5
6.CUBE | ROLLUP 子句进行操做造成VT6
7.HAVING 对VT6中的数据进行HAVING 条件过滤,而后造成VT7
8.SELECT 从VT7中选择要获取的字段,而后造成VT8
9.DISTINCT 去重数据,造成VT9
10.ORDER BY 对VT9的结果排序后,造成VT10
11.LIMIT 从VT10中取出指定的数据,造成VT11,返回给用户
咱们想要知道咱们的sql语句写的好很差,怎么来判断?
方法一: 直接在数据库上测试,看看执行时间
方法二: explain select xxxx 查看
其中须要关注的几个参数:type 的值有多个 const:表最多有一个匹配行,const用于比较primary key 或者unique索引。eq_ref:它用在一个索引的全部部分被联接使用而且索引是UNIQUE或PRIMARY KEY"。eq_ref能够用于使用=比较带索引的列。ref 对于每一个来自于前面的表的行组合,全部有匹配索引值的行将从这张表中读取。range 给定范围内的检索,使用一个索引来检查行。ref列显示使用哪一个列或常数与key一块儿从表中选择行。rows 显示MYSQL执行查询的行数,简单且重要,数值越大越很差,说明没有用好索引。