1.FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp1
2.JOIN table2 所以先是确定表,再确定关联条件
3.ON table1.column = table2.columu 确定表的绑定条件 由Temp1产生中间表Temp2
4.WHERE 对中间表Temp2产生的结果进行过滤 产生中间表Temp3
5.GROUP BY 对中间表Temp3进行分组,产生中间表Temp4
6.HAVING 对分组后的记录进行聚合 产生中间表Temp5
7.SELECT 对中间表Temp5进行列筛选,产生中间表 Temp6
8.DISTINCT 对中间表 Temp6进行去重,产生中间表 Temp7
9.ORDER BY 对Temp7中的数据进行排序,产生中间表Temp8
10.LIMIT 对中间表Temp8进行分页,产生中间表Temp9
2.mysql索引失效场景
1.避免使用 select* 全表扫描会失效
2.模糊查询时 like "%刘" 导致全表扫描 百分号在前会失效 “刘%” (不一定会失效)
3.使用函数在索引列上或在条件上进行运算 where id-1=10/whereDATE(create_time) between "" and ""4.not in exist 都会导致索引失效
5.B-TREE索引 isnull 不会走 is not null 会走
6.复合索引 (time,name,age)第一种情况 time没有命中 name,age不会走索引(复合索引采用的是最左匹配原则)第二种情况 time命中索引但name没有命中 age还是不会走索引
7.使用 !=或<> 都会导致全表扫描 失效
8.mysql在使用字符串时不加单引号 '' 会失效 (因为mysql会在底层对其进行隐式的类型转换)where name='2000';where name=2000;
3.on和where的区别
1.在针对left join、right join 、union时,on和where产生的结果集是不同的, on是在连接时产生临时表的条件,假如 a left join b on a.id=b.id 此时on 返回的数据是满足a.id=b.id并且左表的数据都在的临时表temp1的数据;2.inner join 返回的数据是相同的;
1. 例子 .alter table 表名 add 索引类型 索引名称(索引列);2. 普通索引 alter table 'table_name' add index index_name('column');3. 主键索引 alter table 'table_name' add primary key('column');4. 唯一索引 alter table 'table_name' add unique('column');5. 全文索引 alter table 'table_name' add fulltext('column');6. 多列索引(组合索引) alter table 'table_name' add index index_name('column1','column2','column3',...,'columnn');7. 删除索引 DROP INDEX index_name(索引名称) ON table_name(表名);