济南传承网站建设公司,前端网站效果有哪些,永川建网站,成都制作网站一、底层原理
sql慢是因为没有走索引#xff0c;因此需要添加索引然它走索引联合索引需要匹配最左匹配原则#xff08;索引回表#xff09;如果查询列超出索引的key#xff0c; 会导致回表#xff0c;回表数量多#xff0c;则会走全表扫描 索引是分聚集索引、非聚集索引…一、底层原理
sql慢是因为没有走索引因此需要添加索引然它走索引联合索引需要匹配最左匹配原则索引回表如果查询列超出索引的key 会导致回表回表数量多则会走全表扫描 索引是分聚集索引、非聚集索引的因此如果select * from id 1,这个是直接走聚集索引也就是主键索引叶子节点存储的是全部列的数据这样就不需要回表但是如果是select * from name ‘xx’ ,name列创建的索引是非聚集索引叶子节点是存储的是idname)这样会通过ID去聚集索引再去找。 索引分为聚集索引和非聚集索引一次sql查询只会查询一次索引inner join \ left join \right join 需要区分驱动表和被驱动表驱动表应该为小表被驱动表为大表 需要在被驱动表添加索引 inner join 有优化left join ,左边的表则为驱动表右边的表为被驱动表。right join 右边为驱动表左表为被驱动表。 group by 应该先过滤再group by ,,in,between等等,都是可以使用索引的
二、sql优化
查询SQL尽量不要使用select *而是具体字段避免在where子句中使用 or 来连接条件 or 不走索引可以使用union all或者union来连接不同条件的查询虽然两者都不会走索引但是or的话可能会全表扫描索引扫描合并如果它一开始就走全表扫描直接一遍扫描就搞定 尽量使用数值替代字符串类型使用varchar代替char避免在where子句中使用!或操作符避免在索引列上使用内置函数优化like语句尽量采用右模糊查询 即like ‘…%’是会使用索引的使用explain分析你SQL执行计划 1、type system表只有一行记录这个是const的特例一般不会出现可以忽略 const表示通过索引一次就找到了const用于比较primary key或者unique索引。因为只匹配一行数据所以很快。 eq_ref唯一性索引扫描表中只有一条记录与之匹配。一般是两表关联关联条件中的字段是主键或唯一索引。select * from a,b where a.id b.id ref非唯一行索引扫描返回匹配某个单独值的所有行; select * from a where a.key 1; range只检索给定范围的行使用一个索引来选择行。当使用、、、、、、IS NULL、、BETWEEN或者IN操作符用常量比较关键字列时可以使用range index遍历索引树。通常比ALL快因为索引文件通常比数据文件小。all和index都是读全表但index是从索引中检索的而all是从硬盘中检索的。select id from b; all全表扫描 性能排名system const eq_ref ref range index all。 实际sql优化中最后达到ref或range级别。 2、Extra常用关键字 Using filesort使用外部的索引排序而不是按照表内的索引顺序进行读取。一般需要优化 Using temporary使用了临时表保存中间结果。常见于排序order by和分组查询group by最好优化 Using index只从索引树中获取信息而不需要回表查询 Using whereWHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行如果Extra值不为Using where并且表联接类型为ALL或index查询可能会有一些错误。需要回表查询。 数据库和表的字符集尽量统一使用UTF8 字符不一致也不会走索引 3. using filesort
Using filesort表示在索引之外需要额外进行外部的排序动作。导致该问题的原因一般和order by有者直接关系一般可以通过合适的索引来减少或者避免。 Using filesort 的含义很简单就是使用了排序操作和file没有任何关系出现这个选项的常见情况就是 Where 条件和 order by 子句作用在了不同的列上。
当Where 条件和 order by 子句作用在不同的列上建立联合索引可以避免Using filesort的产生 可以看到联合索引在b树上会根据最左匹配原则先将前面的排号序相同前key的值会对第二个进行排序。
比如select name from a where a.type 3 order by name desc;
那么这里会先走type的索引找到type3的值会获得对应ID然后去聚集索引再查询对应的内容然后会根据内容的name进行排序这样explain会出现using filesort。但是我们可以创建一个type name联合索引这样查询到的type的id就是排好序的id了。