SQL性能优化常见命令

一: 当发现mysql程序运行缓慢时,在排除sql主机问题之后,可以尝试在schema,table,和sql上进一步进行考查

1、mysql> show full processlist;

在这里插入图片描述

​ 该命令用于查看当前连接到mysql服务器的链接,以及经行的什么操作DML,DDL;以及状态;

2、确定耗时过多的查询语句:(show status 用于数据库运行时统计信息,show variables用于查询数据库的设置)

mysql> show status like 'slow_queries';//查询慢查询次数;

mysql> show variables like 'long_query_time';//查看慢查询设置的时间 ,默认10s

mysql> set long_query_time = 1;//设置慢查询时间

3、SQL执行效率,检查需要性能优化命令(为SQL执行一条执行计划): explain

mysql> explain select * from userinfo;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: userinfo
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 5
Extra: NULL
1 row in set (0.00 sec)

4、查询建表时语句:show create table [table_name]

mysql> show create table userinfo;
*************************** 1. row ***************************
Table: userinfo
Create Table: CREATE TABLE `userinfo` (
`usersn` int(10) unsigned NOT NULL AUTO_INCREMENT,
`usernick` varchar(10) NOT NULL,
`lastlogintime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`usersn`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

5、查看表的状态: show table status like

mysql> show table status like 'userinfo'\G;
*************************** 1. row ***************************
Name: userinfo
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 5
Avg_row_length: 3276
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 6
Create_time: 2015-05-15 15:36:02
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

二、总结命令

1、explain:解释sql的执行计划,后边的sql不执行

2、explain partitions: 用于查看存在分区的表的执行计划

3、explain extended: 待验证

4、show warnings:

5、show create table: 查看表的详细的创建语句,便于用户对表进行优化

6、show indexes : 查看表的所有索引,show indexes from table_name,同样也可以从information_schema.statistics表中获得同样的信息。cardinality列很重要,表示数据量。

7、show tables status: 查看数据库表的底层大小以及表结构,同样可以从information_schema.tables表中获得底层表的信息。

8、show [global|session]status: 可以查看mysql服务器当前内部状态信息。可以帮助却行mysql服务器的负载的各种指标。默认是session。同information_schema.global_status和information_schema.session_status

9、show [global|session] variables : 查看当前mysql系统变量的值,其中一些值能影响到sql语句的执行方式。同information_schema.global_variables和information_schema.session_variables;

10、information_schema: 包含的表的数量和mysql的版本有关系。

三、索引

1、数据完整性: 通过主键和唯一键来确保数据唯一性

主键(primary key):每个表只能有一个,主键不为null,定义了auto_increment列,那么此列就必须是主键的一部分。

唯一键(unique key):表中可以存在多个唯一键,每个key可以为null,即null!=null

2、创建单列索引: 这里要注意的是可以在一列上创建多个索引,但是这样会产生性能开销

alter table table_name add primary key|index index_name (coumn_name);

3、当存在多个索引的时候,如何确定选择使用哪个索引更高效

根据索引中唯一值和索引中总行数做比较,唯一值越多,使用这个索引时以更少读得到查询结果。

禁用优化器设置:
set @@session.optimizer_switch='index_merge_intersection=off';

4、在like查询中(%)不会走索引

5、不支持函数索引,另外在索引上使用函数,执行计划也不会走索引。

6、唯一索引:提供数据完整性,保证在列中任何值都出现一次,告知优化器,给定的记录最多只有一条结果返回,避免了额外的索引扫描

是否进行了额外的索引扫描,可以使用下边的语句查看:

flush status;

show session status like 'handler_read_next';

select name from student where name='Randy';

show session status like 'handler_read_next';

7、对于结果的排序: 如果不是根据索引字段进行排序,mysql会使用内部文件排序算法对返回额行按照指定顺序进行排序。使用索引字段进行排序的话将免去分类的过程。

8、组合索引: 索引的执行顺序是按照组合索引中每个字段的cardinality来确定使用哪个组合索引。有的时候交换一下组合索引列的顺序,执行效率会更好。主要可能组合索引的最左列。

组合索引列不要太宽,ref表示使用了那几个组合索引字段,key_len表示索引字段的长度

9、查询提示

通过查询提示来修改查询的执行计划。

straight_join: 强制按照from后边的关联顺序去执行链接操作,不管执行计划是否是最优的。

10、索引提示

索引提示都会被链接中的表来使用,为每张表定义use、ignore、force类表

use [index|key] [for( join|order_by|group_by)] [index_list] 
--让优化器倾向于使用指定的索引扫描

ignore [index|key] [for( join|order_by|group_by)] [index_list]

force [index|key] [for( join|order_by|group_by)] [index_list] 
--让优化器倾向于索引扫描而不是全表扫描

11、索引DML操作的影响:影响写操作的性能。重复索引

12、DDL:在修改表索引的时候会锁表。会影响存储空间的大小。

发布了10 篇原创文章 · 获赞 0 · 访问量 228

猜你喜欢

转载自blog.csdn.net/weixin_42208686/article/details/105141998