特点:同一个SQL查询过程中,只会命中一个索引 有student表如下: 表中的数据:
查询SID=1的学生信息的执行过程: 可以看到:possible_keys: PRIMARY,id ,在SQL执行过程中用主键索引进行查找 key: PRIMARY,在主键索引上一条数据就可以查到结果。查询name="ZhaoLei"的学生信息的执行过程: where 后面跟的是 Sname=‘ZhaoLei’ ,分析能够通过索引idx_name辅助索引树找到name=‘ZhaoLei’ 对应的主键,到主键索引上查询主键为1对应的一列数据并返回。查找Sname=‘ZhaoLei’ 对应的SID where 后面跟的是 Sname=‘ZhaoLei’ ,分析能够通过索引idx_name辅助索引树找到name=‘ZhaoLei’ 对应的主键,select查询的是SID,在辅助索引上已经满足条件,所以不需要再主键索引上再次查询。创建一个订单表 插入数据: 查看表如下: 从结果可以看出,该表没有添加任何索引
查询userid=1,按照日期升序排序:
给userid创建索引 给date创建索引 创建联合索引有两个表student和SC 联表查询分析: 在使用多表进行连接查询时,MySQL首先会判断哪个表小(表小指的是行数少) 连接查询时,小表总是要整表搜索,建索引是没有用的,大表创建索引可以提高查询效率,小表决定了查询次数,小表决定了查询时间。
在连接查询中,大小表的角色是不一定的,没有where字句,那么就按表的行数来决定,如果有where子句,就按条件过滤完的行数来定大小表!!
like后面的通配符在前面,索引会失效
select * from student where Sname like 'z%'; //索引有效 select * from student where Sname like '%z'; //索引失效mot in、!=、or、函数、类型转换、未使用联合索引第一列等都无法使用索引
MySQL可以设置慢查询日志,当SQL执行时间超过设定阈值,SQL就会被记录到慢查询当中,通过查看日志,用explain分析SQL执行计划来判定效率低下的原因。
SQL执行超过阈值时间参数可以设置:long_query_time(单位:秒) 查看SQL:show variables like ‘long%’; 慢查询日志存放在MySQL路径下,默认名称是:host_name_show.log
MySQL提供show status 命令,查看MySQL运行参数,可以查看select、insert、delete、update语句执行频率,慢查询次数,事务的提交和回滚的次数。