MySQL索引优化(索引三表优化案例)
2023-09-14 08:57:06 时间
建表SQL
phone、book表建立索引
【关联优化查询建议】
1、保证被驱动表的join字段已经被索引
被驱动表 join 后的表为被驱动表 (需要被查询)
2、left join 时,选择小表作为驱动表,大表作为被驱动表。
但是 left join 时一定是左边是驱动表,右边是被驱动表
3、inner join 时,mysql会自己帮你把小结果集的表选为驱动表。
mysql 自动选择。小表作为驱动表。因为 驱动表无论如何都会被全表扫描?。所以扫描次数越少越好。
4、子查询尽量不要放在被驱动表,有可能使用不到索引。
select a.name ,bc.name from t_emp a left join
(select b.id , c.name from t_dept b
inner join t_emp c on b.ceo = c.id)bc
on bc.id = a.deptid.
上段查询中用到了子查询,必然 bc 表没有索引。肯定会进行全表扫描
上段查询 可以直接使用 两个 left join 优化
select a.name , c.name from t_emp a
left outer join t_dept b on a.deptid = b.id
left outer join t_emp c on b.ceo=c.id
所有条件都可以使用到索引
若必须用到子查询,可将子查询设置为驱动表,,因为驱动表的type 肯定是 all,而子查询返回的结果表没有索引,必定也是all
【子查询优化】
用in 还是 exists
1、实验
有索引 小表驱动大表 select sql_no_cache sum(e.sal) from (select * from emp where id<10000) e where exists (select 1 from emp where e.deptno=emp.deptno); select sql_no_cache sum(e.sal) from (select * from emp where id<10000) e inner join (select distinct deptno from emp) m on m.deptno=e.deptno; select sql_no_cache sum(sal) from emp where deptno in (select deptno from dept);
有索引小驱动大表 性能优于 大表驱动小表
无索引 小表驱动大表 select sql_no_cache sum(e.sal) from (select * from emp where id<10000) e where exists (select 1 from emp where e.deptno=emp.deptno); select sql_no_cache sum(e.sal) from (select * from emp where id<10000) e inner join (select distinct deptno from emp) m on m.deptno=e.deptno; select sql_no_cache sum(sal) from emp where deptno in (select deptno from dept);
无索引大表驱动小表
select sql_no_cache sum(sal) from emp where deptno in (select deptno from dept);
select sql_no_cache sum(sal) from emp where exists (select 1 from dept where emp.deptno=dept.deptno);
select sql_no_cache sum(sal) from emp inner join dept on emp.deptno=dept.deptno;
相关文章
- MySQL数据库密码查看指南(mysql数据库密码查看)
- MySQL 搭建及其管理指南(mysql搭建)
- MySQL索引使用指南:提升系统性能(mysql索引怎么用)
- 优化MySQL表的索引使用方法(mysql表的索引)
- MySQL在线添加索引:简单便捷的优化方式(mysql在线添加索引)
- 研究MySQL返回值研究:深入了解数据库查询结果(mysql返回值)
- MySQL密码删除:安全实现无忧(删除mysql密码)
- MySQL命令行操作技巧提升(mysql执行命令行)
- MySQL 删表卡死:案例分析与解决方案(mysql删表卡死)
- MySQL如何重新索引以提高性能(mysql重新索引)
- 简单易懂:如何在MySQL中添加表索引(mysql添加表索引)
- MySQL 查询解决死锁问题(mysql查询死锁)
- MySQL慢查询:不使用索引的恶果(mysql不使用索引)
- 提升MySQL索引:提升查询速度的利器(mysql建索引速度)
- 本MySQL 汉化版本:打造完美中文用户体验(mysql 汉化版)
- MySQL模糊查询:实现超越精准搜索的关键技术(mysql 模糊查询语句)
- Mysql数据库:从下载到安装完成(mysql数据库下载安装)
- 大小Mysql最大数据表大小探究(mysql最大表)
- 将CSV数据导入MySQL中实现数据仓库管理(csv挂到mysql)
- CRM集群成功启动MySQL数据库(crm集群启动mysql)
- ADO远程访问MySQL的入门指南(ado远程访问mysql)
- 快捷方便使用csv快速导入MySQL数据库(.csv导入mysql)
- MySQL中冒号的多种用途(mysql中冒号的用法)
- MySQL迁移实现不停服操作(mysql不停服迁移)
- 提高查询效率,了解MySQL不等索引优化策略(mysql不等 索引)
- MySQL运行缓慢看看你的数据库中是否有未使用索引的情况(mysql不用索引情况)
- MySQL实例一对一关系案例分析(mysql一对一案例)