1. join的实现原理及优化思路
两个 for 连接关系
- 外 * 内 = 循环次数
- 尽量让关联字段在索引上 主键(hash)
- join buffer
for (){ 外
for(){ 内
}
}
老师where order by 字段建联合索引失效,怎么处理好啊 explain show warnings
3. 问题
1. 一般on后面都是用主键关联的吧,用主键做条件有什么问题吗? 主要是非驱动表会使用这个主键作为索引条件查询,而作为主键通常来说并不会与其他字段再建立以主键为第一个的联合索引,因此对于非驱动表的where上的查询条件就很难使用到索引了. 先查询驱动表数据 驱动关联的字段 去找非驱动表中的数据 2. 唯一索引页可以起主键索引的效果吗? yes - idx_col_id(); 3. 用主键索引应该好过用下面yearbonus的索引好吧,这里怎么判断用哪个索引好的? a. mysql的优化器会进行索引的推导选择与合适的索引,通常来说是会选择合适的索引的,但是有些时候我们还是需要自己去根据自己定义的索引来强制mysql索引索引,因为mysql他也会存在失误判断的情况. b. 判断的方式主要是看索引上的使用率,简单来说定义的索引包含的字段在SQL中能够使用到 4. 是建议用主键做条件,还是不建议? 这个问题没有绝对答案,但是通常来说推荐主键作为条件在单表的时候在join的时候不一定了如上1有解释;因此单表推荐使用主键作为条件,join看实际操作吧并不是特别推荐有限制 5. 使用order by 是不是总会出现隐式临时表Using temporary?order by有没有可优化的空间。(group by 也是) mysql是先根据where 从磁盘中获取数据(using where 和 using index) ;然后会把他们变成虚拟表再进行排序所以会有(Using temporary)
4. 性客户的数量和平均月薪&不同城市的客户数量和平均月薪
5. 列出没有手机号码,或者没有照片,或者没有年奖金的客户姓名
6. 不同年龄段(0到100岁之间,每10岁为一个年龄段)的客户平均年收入&列出每个城市的年收入最高和最低的男性和女性的姓名和年收入
索引在联合查询的时候驱动以及索引的建立
驱动表选择,建立索引之后优化效率最高的
背景:数据量相同的情况下
知识:正常的没有join连接小表做驱动
数据量(驱动表刷选之后的数据量) > 大表的查询率低于小表的查询, 优化考虑大表 查询效率 > 优化考虑获取是否进行函数操作(获取之后还需进行函数处理就考虑优化使用函数字段的表)
本质是全表的查询就要考虑优化大表
同等的大小:优化考虑获取列的复杂度(获取之后还需进行函数处理就考虑优化使用函数字段的表)
customers
优化的核心点:选择最需要优化
select a.id,a.gender,a.city,max(monthsalary * 12 + yearbonus) as income from customers a ,salary b where a.id = b.id group by gender,city
- 表大小
- 获取的列 -> 是否有做运算 -> 运算复杂