1配置文件
查看字符编码
设置字符编码:
1.
总体要设置的
注意事项:修改编码,只对之后创建的数据库生效,因此,建议在刚安装完成mysql后 第一时间设置字符编码
ctrl+l 清屏
mysql 逻辑分层:
查询优化器: 将用户写的sql语句进行优化,存在一个问题(待补充)
sql查询慢的原因:
查询语句执行顺序
索引的优点缺点 和适用情况等
btree(非 b+ tree)
sql性能问题:
explain
要求:查询相应数据
使用执行计划来分析多表连表查询时的笛卡尔乘积的区别(连表顺序),和执行顺序区别
执行计划来查询数据(多表查询)
当将教师表数据增加到6条的时候(多表查询)
执行顺序发生变化的原因分析
当id值不同时执行顺序,从大到小的顺序执行(id值越大越优先)
(子查询,从里到外)
主查询和子查询(多表查询和子查询混合使用)
简单查询 simple(不包含子查询,union)
衍生查询
a.在from子查询中只有一张表
b子查询中使用union进行链表查询的时候 左表就是衍生查询(mysql5.N 特性,在mysql8.0有修改)
计划任务中的 select_type字段的解释
1。system(很少能达到这个级别) :只有一条数据的表,或衍生表只有一条数据的主键查询 基本也达不到,很难达到这个type
2.const 必须是用到primarykey 或unique key 基本也达不到,很难达到这个type
3.eq_ref:唯一索引,对于每个索引建的查询,返回匹配为一行的数据(有且只有一个,切不能多,不能为0)基本也达不到,很难达到这个type
对于每个索引建的查询,返回匹配的所有行(0个或多个)
索引指定范围的行,wherer后边是一个范围查询(betwenn, > , < , >= ,<= ,特殊:in 有时候会失效,all, 查询所有行)
index:
将索引树全部查一遍
all:
将表中的全部数据查询一遍
比如 select * from course where tid=1 如果tid 不是索引需要扫面全部表中的数据
possible_keys:可能用到的索引,是一种预测,有时候不准
key:用到的索引
如果possible_keys 和key 是 null 则说明没有用到索引
key_len:索引长度
主要作用:1.判断复合索引是否全部被使用
单值索引也可以用key_len 但是一般都是一个固定的值
如果索引字段可以为空,这会多使用一个字节,用于标识。 则这个字段key_len 是 字段长度+1
作用:指明当前表所参照的字段
被索引优化查询的 数据个数
a) using filesort: 性能消耗大,sql语句需要额外一个排序(查询) 常见于order by 语句中
小结:对于但索引:如果排序和查找是同一字段,不会出现 using filesort;如果排序和查找不是同一字段,会出现 using filesort;
避免方法:where哪些字段就 order by哪些字段
复合索引:不能跨列 (最左前缀)
这种不会出现
如何避免:使用复合索引的时候 where 和order by 按照复合索引的顺序使用 不要跨列或者无序使用
b) using temporary :性能损耗较大,用到了临时表,已经有表了,但不适用,需要额外再使用一张临时表,一般出现在group by 语句中
如何避免:查询哪些列就按照哪些列进行分组
c) using index:性能提升了,索引覆盖(覆盖索引)
原因:不读取源文件(原来的数据库表),直接能从索引中把数据取出
只要使用到的索引列 全部都在索引中,就是索引覆盖 using index
索引覆盖会对possible_keys 和key造成影响
a:如果没有where则索引只出现在key中;
b:如果有where,则索引出现在key和possible_keys中
例子如下
d)using where: 需要回表查询
假设age是索引列
explian select name,age form user where age=11
则这个就会在extar中打印 using where
e)impossible where :where 字句永远为false
优化示例:
不好的使用顺序
using filesort 文件内排序,
where 和order by 一起用的时候,不要跨列使用,否则回出现这个 查询效率低
总结:1如果复合索引(a,b,c,d) 和使用顺序一致(且不跨列使用(where 和order by 一起用的时候不要跨列)),则复合索引全部使用,否则使用部分索引