mysql优化

执行计划含义:

mysql优化_第1张图片


mysql 语句的优化

1.优化sql语句的一般步骤
2.索引问题
3.两个简单使用的优化方法
4.常用的sql优化


1.优化sql语句的一般步骤
通过show status命令了解各sql执行的频率
格式:show [session|global] status;记录影像的次数
其中;session:(默认)表示当前连接
global:表示自数据库启动至今
show session status like "com_select/insert/update/select%"
com_select/insert/delete/update

针对innodb存储引擎:记录影像的行数
InnoDb_row_read/update/insert/delete

连接数据库的次数:
show session status like "connect%"

慢查询:
show variables:查看系统的参数
show session status like "%slow%"
慢查询时间:
show session status like "%long%":默认10秒,查过10秒就会慢查询,记录在慢查询日志里面,然后去日志里面看那些sql语句需要优化


定位执行效率较低SQL语句:
1.explain select * from table where id=100;
2.desc select * from table where id=100;

优化顺序:
1.查看慢查询日志,分析日志里面超过10秒的查询语句
2.用desc select * from 来定位
3.建立适当的索引

2.group by优化:
group by 分组聚合以后会自动排序,如果想避免排序影响效果可以用order by null 来禁止排序
3.优化嵌套查询:
select * from t1 a,t2 b where a.id=b.id; 效率低
select * form t1 a where exists(select 1 from t2 b where t1.id.t2.id):效率高,查到就直接返回

4.索引问题:
1.Myisam:存储引擎的表是数据和索引分开的,各自是一个独立的文件(数据文件,索引文件,结构文件);InnoDB存储引擎数据和索引在同一个文件中即同一个表空间中(共享表空间),也可以修改为数据和索引分开多个文件即私有表空间
 mysql不支持函数索引,但是能对列的前面一部分进行索引,列入name字段,可以取name前4个字符进行索引,这个特性可以减小索引文件的大小
 
2.对于创建的多列索引,只要查询的条件中用到的最左边的列,索引一般就会被引用,如下创建一个复合索引:
create index my_index on table_name(cloumn1.column2);
 然后按照clumn1查询:
select * from table_name where cloumn1=?,使用了符合索引。
 按照clumn2来查询就没有用到符合索引
 like:"XX%"使用索引
 如果列明是索引 使用 column is null 使用索引
 or:前有索引后没有则不会用索引

5.表优化:
1.检查表是否有错误:check table table_name;
2.optimize table table_name:优化表,碎片整理支队myisamInnoDB起作用
6.常用sql优化:
1.大批量导入数据:和mysqldump导出相比:

mysqldump:导出数据、索引、表结构(慢)
快速导出:select * from t1 into outfile "/tmp/file.txt":指导出数据(快)


对于myisam存储引擎的表,通过以下方式导入数据:
alter table table_name disable keys
loading the data
alter table taable_name enable keys
disable keysh和enable keys用来打开和关闭Myisma表非唯一索引的更新可以提高速度,对INnoDB无效

模拟:
快速导出:select * ffrom t1 into outfile "/tmp/file.txt"
导入数据:load data infile "/tmp/test.txt" into table t1(name);
在导入的时候回对每一行家索引,倒入一行加一行索引这样效率也低下,可以先全部导入之后再统一加索引
disable keys:关闭普通索引,然后导入在开启索引enable keys
例如:
1.关闭非唯一索引:
alter table table_name disable keys;
2.导入数据:
load data infile "/tmp/test.txt" into table table_name(coulmn)
3.开打非唯一索引:
alter table taable_name enable keys;

如果保证列数据唯一:可以关闭唯一索引提高效率
1.set unique_checks=0(关闭)然后在导入
2.set unique_checks=1(打开)

每次导如一次都commit一次这样效率低,先关闭 set autocommit=0;导入完之后在开启一次性的提交数据
insert into t1 valuers(),(),(),()效率高于insert into t1 values();
load data infile 导入的数据比insert 速度快20陪


  a

你可能感兴趣的:(mysql优化)