MySQL数据库优化是多方面的,优化表结构、索引、查询语句等使查询响应更快。
在MySQL中,可以使用SHOW STATUS语句查询一些MySQL数据库的性能参数。语句语法如下:
SHOW STATUS LIKE 'value';
其中,value是要查询的参数值,一些常用的性能参数如下:
MySQL提供了EXPLAIN语句和DESCRIBE语句,用来分析查询语句。
EXPLAIN语句的基本语法如下:
EXPLAIN [EXTENDED] SELECT select_options
使用EXTENDED关键字,EXPLAIN语句将产生附加信息。执行该语句,可以分析SELECT语句的执行情况,并且能够分析出所查询的表的一些特征。
查询结果的各个字段解释如下:
id:SELECT识别符。这是SELECT的查询序列号。
select_type:表示SELECT语句的类型。它可以是以下几种取值:
table:表示查询的表。
type:表示表的连接类型。
possible_keys:指出MySQL能使用哪个索引在该表中找到行。
key:表示查询实际使用到的索引。
key_len:表示MySQL选择的索引字段按字节计算的长度。通过key_len值可以确定MySQL将实际使用一个多列索引中的几个字段。
ref:表示使用哪个列或常数与索引一起来查询记录。
rows:显示MySQL在表中进行查询时必须检查的行数。
Extra:表示MySQL在处理查询时的详细信息。
DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。DESCRIBE语句的语法形式如下:
DESCRIBE SELECT select_options
DESCRIBE可以缩写成DESC。
使用LIKE关键字的查询语句
在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置,索引才会起作用。
使用多列索引的查询语句
MySQL可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中的第1个字段时,索引才会被使用。
使用OR关键字的查询语句
查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询中才使用索引。否则,查询将不使用索引。
禁用索引
对于非空表,插入记录时,MySQL会根据表的索引对插入的记录建立索引。如果插入大量数据,建立索引会降低插入记录的速度。为解决这种情况,可以在插入记录之前禁用索引,数据插入完毕之后再开启索引。
禁用索引的语句如下:
ALTER TABLE table_name DISABLE KEYS;
重新开启索引的语句如下:
ALTER TABLE table_name ENABLE KEYS;
对于空表批量导入数据,则不需要进行此操作,因为MyISAM引擎的表是在导入数据之后财建立索引的。
禁用唯一性检查
插入数据时,MySQL会对插入的记录进行唯一性校验。
禁用唯一性检查的语句如下:
SET UNIQUE_CHECKS = 0;
开启唯一性检查的语句如下:
SET UNIQUE_CHECKS = 1;
使用批量插入
插入多条记录时,使用一条INSERT语句插入多条记录比用多条INSERT语句插入多条记录速度要快。
使用LOAD DATA INFILE批量导入
LOAD DATA INFILE语句导入数据的速度比INSERT语句块。
对于InnoDB引擎的表,常见的优化方法如下:
(1)禁用唯一性检查
这个和
MyISAM引擎的使用方法一样。
(2)禁用外键检查
禁用外键检查的语句如下:
SET foreign_key_checks = 0;
恢复对外键的检查语句如下:
SET foreign_key_checks = 1;
(3)禁止自动提交
插入数据之前禁止事务的自动提交,数据导入完成之后,执行恢复自动提交操作。
禁止自动提交的语句如下:
SET autocommit = 0;
恢复自动提交的语句如下:
SET autocommit = 1;
分析表
MySQL提供了 ANALYZE TABLE
语句分析表,ANALYZE TABLE
语句的基本语法如下:
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tb1_name] ...
LOCAL关键字是NO_WRITE_TO_BINLOG关键字的别名,二者都是执行过程不写入二进制日志。
使用 ANALYZE TABLE
分析表的过程中,数据库系统会自动对表加一个只读锁。
在分析期间,只能读取表中的记录,不能更新和插入记录。ANALYZE TABLE
语句能够分析InnoDB、BDB和MyISAM类型的表。
分析结果的字段说明如下:
检查表
CHECK TABLE
语句能够检查InnoDB和MyISAM类型的表是否存在错误。对于MyISAM类型的表,CHECK TABLE
语句还会更新关键字统计数据。而且,该语句还可以检查视图是否有错误,比如在视图定义中被引用的表已不存在。
该语句的基本语法如下:
CHECK TABLE tb1_name [,tb1_name]...[option]...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
option参数的各个选项的意义如下:
option只对MyISAM类型的表有效。CHECK TABLE
语句在执行过程中也会给表加上只读锁。
优化表
OPTILMIZE TABLE
语句可以优化InnoDB和MyISAM类型的表,但只能优化表中的VARCHAR、BLOB或TEXT类型的字段。
该语句的基本语法如下:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tb1_name] ...
以上关键字与分析表的意义相同。
通过OPTILMIZE TABLE
语句可以消除删除和更新造成的文件碎片。OPTILMIZE TABLE
语句在执行过程也会给表加上只读锁。
MySQL服务的配置参数都在my.cnf或者my.ini文件的[mysqld]组中。
下面列举几个对性能影响较大的参数:
SET SESSION read_buffer_size = n;
可临时设置该参数的值。配置完参数之后,需要重启MySQL服务才会生效。
使用 FLUSH QUERY CACHE
语句可以刷新缓冲区,清理查询缓冲区中的碎片。