执行计划
执行计划能相对准确的表达出当前sql的运行状况,能够被用来查看sql语句的执行效率
创建执行计划:explain sql语句
执行计划会返回一个表格,表格中type和rows比较重要 rows是大概会显示多少行数据
type结果分析:
type 为 all时,会扫描数据表里全部的数据 explain * from tb1; 全表扫描效率低(可以在sql后面添加limit 来提高查找的速率)
type为 index,会扫描索引文件里的数据 explain count(tname) from tb1;,tname列被添加索引 ,查询需要通过扫描索引上的全部数据,它仅仅比全表扫描快一点
type为range时,对索引进行范围查找,explain count(tname) from tb1 where tname>100, 查询的条件为一定范围的索引
type为range_merge时,使用多个单列索引搜索
type为ref时,根据索引查找一个或多个值
type为eq_ref时,对主键或唯一索引进行查找(不能重复)
type为const时,是覆盖索引会一般会出现 查找速率快
当出现type为all和index时,查找效率就不高,就表明sql语句还存在优化的余地
查找语句的正确写法:
索引添加后确实加快查找数据的速度,前提是查找语句的写法要正确。
在对索引列搜索时,尽量使用"abc%" 而不是"%abc"
不要查询经过函数计算后的列的数据,数据经过函数的计算和转换,这样该列的索引无法生效(解决方法就是用函数修改查询的数据)
在查找时,在or条件中有建立索引的列时,数据的查询不会走索引
查找的数据类型与数据表中的数据类型不同
范围查找时,!=和>也不会走索引查找
特殊:对主键走!= 和>查找时,也会走索引查找
对数字类型的索引使用>查找,也会走索引查找
order by :如果对主键排序,则还是走索引
注意事项
避免使用select *
使用count(1),count(列)替代count(*)
创建表声明列时 char替代varchar
创建表时,固定长度的列往前放
组合索引代替多个单个索引
尽量使用短索引
使用连接(join)来代替子查询
连表时注意类型一致
索引列表中数据大量重复,但数据散列值少,不适合键索引 (如性别)
面试必备:
分页:
limit a,b; 从第a行开始,查找b条数据
limit语句的查询原理是,从第一行开始查,查到第a行数据,然后将之后的b条数据打印出来
因此如果a的数值越大,分页查询的效率越低
网上的解决方法是 先查询出a后b条数据的主键码,这是走索引查询的,然后再取数据表中查询主键码符合的数据,这种方法解决的效果不大
有效的方法是:
再前添加主键范围索引, 如 select * from tb2 where tid>10000 limit 11000,10,就可以忽略掉条件里的数据,直接从10001条数据开始查询
因此再做网站数据分页时,可以先获取当前第一条数据的id,和最后一条数据的id
可以将当前页面最后一条数据的id,发给系统,然后查取数据时么一 select * from tb2 where id>收到的Id号 limit 想要获取数据的条数
想要获取上一页的数据,已经提前得到当前页面的第一条数据的id,查询时将小于id以数据倒序排列取前10条即可
select * from tb1 where nid<当前页面的第一条数据的id order by nid desc limit 想要获取数据的条数
就可以高效的获取数据

浙公网安备 33010602011771号