xxtk-mysql优化

一、慢查询
1.慢查询是慢查询的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阀值的SQL语句的
日志。慢查询日志默认是关闭的。
2.常用的配置
slow_query_log启动停止技术慢查询日志。 set GLOBAL slow_query_log=1启动
slow_query_log_file 慢查询日志的存储路径及文件(默认和数据文件放在一起)
long_query_time 指定记录慢查询日志SQL的执行阀值,默认10秒
log_queries_not_using_indexes 是否记录未使用索引的SQL
log_output日志存放的地方
3.慢查询日志的组成
第一行 用户名、用户的IP信息、线程ID号
第二行 执行花费的时间 (毫秒)
第三行 执行获得锁的时间
第四行 获得的结果行数
第五行 扫描的数据行数
第六行 SQL执行的具体时间 (时间戳)
第七行 具体的SQL语句
4.慢查询分析工具 mysqldumpslow
mysqldumpslow -s r -t 10 slow-mysql.log
c 总次数
t 总时间
l 锁的时间
r 总数据行
-t top前面几条
2)pt_query_digest 在远端也可以分析慢查询
总的查询时间
总的锁定时间
总的获取数据量
扫描的数据量
查询大小
5.查看索引 show index from table_name
6.创建索引、约束的语法
1)create table t1(
name varchar(50) not null unique,
);
2)create index idx1 on t1(name);
3)约束:
插件的5类约束
not null
unique
primary key :constraint pk_temp_id primary key(id,classId)
foreign key
check
使用:
create table t2(
in int auto_increment not null primary key,
name varchar(20) unique,
age int,
check(age>20),
constraint fk_id foreign(id) references classes(id);
);
7.mysql的数据类型
整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
浮点数类型:FLOAT、DOUBLE、DECIMAL
字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、
MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日期类型:Date、DateTime、TimeStamp、Time、Year
其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、
MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
8.锁的类型
9.union查询
select * from t1
union
select * from t2
10.执行计划:使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL如何处理你的SQL语句
的 。分析你这条语句或表结构的性能。
explain+SQL语句。
执行计划包含的信息:
id 获取select子句的操作顺序。id相同是从上到下。id值越大优先级越高,优先级高的先执行。
select_type 主要区别是普通查询、联合查询、子查询。
类型Simple、primary(最外层查询)、subquery、derived、union、
union result(从union表获得的select)
table
type 访问类型
system>const>eq_ref>ref>range>index>ALL
system 表只有一行记录
const 通过索引一次就找到了
eq_ref 唯一性索引扫描,对于每一个索引键只有一条记录与之匹配。唯一、主键索引
ref 非唯一索引,返回的多行,
range where语句中出现between、<、>、in等查询。因为它只需要开始于索引的某一点,结束于另一点。
index 扫描整个索引文件 select id from t1
ALL 是全表扫描,用到了一些非索引列
possible_Key 可能使用的索引
key 使用的索引名,如果为null说明没有使用索引。
keytype
key_len 显示值为索引字段的最大可能长度,并非实际使用的长度
latin1占一个字节,gbk占2个字节,utf8占3个字节
char 允许为null时,会多一个字节;varchar允许为空时也是占多一个字节
varchar占用2个字节
可以根据key_len来判断复合索引的生效情况
ref 使用了哪个索引
rows 扫描的行数
extra
using filesort 无法使用索引进行排序,使用了文件排序 order by
using temporary 是否使用了临时表。临时表保存中间结果 order by和group by会使用。也是可以通过索引进行优化的。最左匹配原则。group by col1,col2
using join buffer 使用了join

当一个列有多种类型时:
1.优先考虑数字类型
2.其次是日期、时间类型
3.最后是字符类型
4.对于同级别的数据类型,应该优先选择占用空间小的数据类型。

二、sql优化
1.尽量全值匹配
2.最佳左前缀法则。就像火车:由火车头、火车、火车尾等组成。火车头没了就不能开了,也就是索引失效。只是说不能丢,位置没有规定,不一定要放在第一个
3.不要在索引列上做任何操作
4.如果使用了范围索引查询,会导致范围查询之后的索引失效,范围索引不失效,之后的失效。
select * from staffs where name = 'July' and age>20 and pos='manager'
5.尽量使用覆盖索引,少用select *
如果使用*,数据不再覆盖索引中,找到了所在的行还要去找data。如果使用覆盖索引,那么直接可以找到索引就返回数据。
6.不等于时,如果选择的列不是覆盖索引,会导致全表扫描。
7.null和not not的影响
如果是not null;查询 where name is null //返回的impossible 不可能扫描
查询 where name is not null //全表扫描 也是没有使用索引,为了使用索引可以select 覆盖索引
如果可以为null; 查询 where name is null 使用了索引 ref
查询 where name is not null 使用了索引 range类型
8.like可能会导致索引失效。
like '%abc'失效,但是如果select的列是覆盖索引,那么是不会失效的。
like 'abc%'不失效。
9.字符串类型加引号,
不加使用覆盖索引也会生效
10.or查询索引会失效,应该改成union
select * from staffs where name='July' or name = 'z3'
改成
select * from staffs where name='July'
union
select * from staffs where name='z3'

11.覆盖索引是万能的

12.葵花宝典
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写*;
不等空值还有OR,索引影响要注意;
VAR引号不可丢, SQL优化有诀窍。

create table product3 select * from product2 where 1=2;//where 1=2表示只需要表的结构,不需要表的数据。

14.desc会导致filesort。如果去掉的话直接是索引排序

原文地址:https://www.cnblogs.com/kltsee/p/12626381.html