业务数据LEFTJOIN多表查询慢--优化操作
⾸先你会想到,给表加索引,那么mysql会给主键⾃动建⽴索引吗?
会的,当然会。
在我们查询的业务表操作的时候,表业务数据庞⼤起来的时候,以及left join多的时候,甚⾄多表关联到⼏⼗张表的时候,查询是慢到外婆家⾥去了。
这时候,只需要给表join查询的字段,及表结构,进⾏索引优化,即可解决这个慢的问题。
⼀,⾸先利⽤explain 关键字对查询的SQL进⾏分析。
# type=ALL,全表扫描,MySQL遍历全表来到匹配⾏
# type=index,索引全扫描,MySQL遍历整个索引来查询匹配⾏,并不会扫描表
# type=range,索引范围扫描,常⽤于<、<=、>、>=、between等操作
# type=ref,使⽤⾮唯⼀索引或唯⼀索引的前缀扫描,返回匹配某个单独值的记录⾏
# type=eq_ref,类似ref,区别在于使⽤的索引是唯⼀索引,对于每个索引键值,表中只有⼀条记录匹配
# type=const/system,单表中最多有⼀条匹配⾏,查询起来⾮常迅速,所以这个匹配⾏的其他列的值可以被优化器在当前查询中当作常量来处理# type=NULL,MySQL不⽤访问表或者索引,直接就能够得到结果
*** 重点来了,为表添加索引,如果发现分析出来的表type 为all ,我们⾸先想到这个表没加索引,我们给他加上 ***
1.对查询进⾏优化,应尽量避免全表扫描,⾸先应考虑在 where 及 order by 涉及的列上建⽴索引
mysql引擎放弃使⽤索引⽽进⾏全表扫描的⼏种情况:
应尽量避免在 where ⼦句中对字段进⾏ null 值判断,可以设置默认值0
应尽量避免在 where ⼦句中使⽤!=或<>操作符
应尽量避免在 where ⼦句中使⽤or 来连接条件,in 和 not in 也要慎⽤
模糊查询select id from t where name like ‘%李%’也会全表扫描,若要提⾼效率,可以考虑全⽂检索
------------------添加完后--⼤功告成----------------------
sql left join 多表连接MySQL⽬前主要有以下⼏种索引类型:
1.普通索引
2.唯⼀索引
3.主键索引
4.组合索引
5.全⽂索引
mysql Hash索引和BTree索引区别
⼀、BTree
BTree索引是最常⽤的mysql数据库索引算法,因为它不仅可以被⽤在=,>,>=,<,<=和between这些⽐较操作符上,⽽且还可以⽤于like操作符,只要它的查询条件是⼀个不以通配符开头的常量,例如:
select * from user where name like ‘jack%’;
select * from user where name like ‘jac%k%’;
如果⼀通配符开头,或者没有使⽤常量,则不会使⽤索引,例如:
select * from user where name like ‘%jack’;
select * from user where name like simply_name;
⼀、Hash
1. hash索引查数据基本上能⼀次定位数据,当然有⼤量碰撞的话性能也会下降。⽽btree索引就得在节点上挨着查了,很明显在数据精确查⽅⾯hash索引的效率是要⾼于btree的;
2. 那么不精确查呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查hash索引⽆效,不⽀持;
3. 对于btree⽀持的的最优前缀,hash也是⽆法⽀持的,中的字段要么全⽤要么全不⽤。提起最优前缀居然都泛起迷糊了,看来有时候放空得太厉害;
4. hash不⽀持索引排序,索引值和计算出来的hash值⼤⼩并不⼀定⼀致。
MySQL是只⽀持⼀种JOIN算法Nested-Loop Join(嵌套循环链接)  ---
没有索引时会⾛,Block Nested-Loop Join⽐Simple Nested-Loop Join多了⼀个中间join buffer缓冲处理的过程
没有索引时:
当关联字段有索引时,⾛的是Index Nested-Loop Join(索引嵌套链接)  ---
有索引时;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。