犹如两层循环,外层是小表,内层是大表
select * from A where id in (select id from b):
等价于:
for select id from b
for select * from A where A.id =B.id; //相当于从b中 选一个id ,去与A 中的每个比较 是不是相等
b表要小于A 表
select * from A where exists (select 1 from B where B.id=A.id):
//将主查询的数据,放到子查询中做条件验证,根据验证结果(true,False)来决定著查询的数据结果是否得以保留。
for select * from A
for select * from B where B.id=A.id;
A 表 要小于B 表
oderby 优化
filesort 单路排序 存在的问题:
解决办法:
让排序用上索引才是最好的选择:
1.尽量用上索引覆盖,尽量不使用 select *
mysql的两种排序方式:filesort ,和那个using INdex
group by 与order by 相似:
慢查询日志分析·:
1.首先要开启,可以mysql 中设置但这是暂时的,当重启MySQL时会自动关闭。
show variables like 'slow_query_log%'; //显示开启状态
set global slow_query_log=1; 设置状态
如果想设置成一直开启,不会因为重启导致关闭,就要在文件中配置;
linux 是 my.cof
win 是 my.ini
开启之后 设置一个阈值,当一个sql 语句超过这个阈值时 会被记录到 xxxx-slow.log 中去;
设置阈值: set global long_query_time=3;
示例:
当执行这个语句后:select sleep(4);
xxxx-slow.log 文件中就变成这样:
可以这个工具进行 日志操作:
mysqlddumpslow