Mysql性能优化,即提高数据库运行速度以及减少磁盘空间使用。常常考虑的优化有 查询速度、优化更新速度和优化服务器。
针对数据量大,查询操作连接操作频繁的语句进行优化,可以明显提高数据库的性能。如果Mysql数据库中需要进行大量的查询操作,那么对查询语句的优化可以提高整体的查询速度;如果连接Mysql数据库的用户很多,那么就需要对Mysql服务器进行优化,否则,大量的用户同时连接Mysql数据库,可能会造成数据库崩溃。
数据库管理员可以使用show status语句查询mysql数据库的性能。语法形式如下:
show status like 'value';
value参数是常用的几个统计参数。常用参数介绍如下:
Connections:连接mysql服务器的次数;
uptime:mysql服务器的上线时间
slow_queries:慢查询的次数;
com_select:查询操作次数
com_insert:插入操作次数
com_update:更新操作的次数
一、优化查询
查询是数据库中最频繁的操作。提高了查询速度可以有效的提高mysql数据库的性能。
1.分析查询语句
explain select 语句;
Id:表示select语句的编号
table:查询的表
possible_keys:可能使用的索引
key:查询使用到的索引
key_len:表示索引字段的长度
ref:表示使用那个列或常数与索引一起来查询记录;
rows:表示查询的行数
extra:表示查询过程的附件信息。
二、索引对查询速度的影响;
我们通过某个字段查询某条记录,我们需要扫描整个表,而设置索引,可以快速定位表中的某条记录。使用索引可以提高数据库查询速度。
2.1查询语句中使用like关键字
如果匹配字段串的第一个字符为%时,索引不会被使用,如果%不是在第一个位置,索引就会被使用。
explain select * from student where name like'zy%'\G
2.2查询语句中使用多列索引
多列索引是在表的多个字段上创建一个索引。只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。
create index index_birth_department on student(birth,department)
explain select * from student where birth=1991\G 使用到了
explain select * from student where department=1991\G 没有使用到索引
2.3.查询语句中使用or关键字
查询语句只有or关键字时,如果or前后的两个条件的列都是索引时,查询中将使用索引。如果or前后有一个条件的列不是索引,那么查询将不使用索引。
优化子查询:
子查询执行效率不高,因为在查询过程中,会为内层查询语句建立临时表,然后外层查询语句在临时表中查询记录。查询完毕后,mysql撤销临时表。子查询的速度会受到影响。如果查询数据量大,这种影响就会随之增大,在mysql中可以使用连接查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快。
三、优化数据库结构
查找记录:
3.1将字段很多的表分解成多个表
Eg.对于有些备注信息,在查询过程种很少用到,那么可以将其放在另一个表中;
3.2增加中间表
eg.对学生表和成绩表,需要输出成绩表中的学号、姓名以及成绩表中的成绩,因此可以直接生成一个含有学号姓名成绩的表,减少连表查询的效率。牺牲磁盘空间。
3.3增加冗余字段
eg.学生表:学号 学院编号
学院信息:学院编号 学院名称
想查找某个同学所在学院名称,需要连表查询,先在学生表中查找到学院编号,在通过学院编号在学院信息表中查找对应的学院名称。
优化插入记录速度:
1.禁用索引
插入记录时,mysql会根据表的索引对插入的记录进行排序。如果插入大量数据时,这些排序会降低插入记录的速度。为了解决这种情况,在插入记录之前先禁用索引,等到记录都插入完毕后再开启索引。
禁用索引:
alter table 表名 disable keys;
重新开启索引:
alter table 表名 enable keys;
2.禁用唯一性检查
插入数据时,mysql会对插入的记录进行唯一性校验。这种校验也会降低插入记录的速度。可以在插入记录之前禁用唯一性检查。等到记录插入完毕后再开启。
禁用唯一性检查: set unique_checks=0;
重新开启唯一性检查 set unique_checks=1;
3.优化insert语句
插入多条记录时,采用一次插入多条语句效率较高
分析表、检查表和优化表
分析表主要作用是分析关键字的分布。检查表主要作用是检查表是否存在错误。优化表主要作用消除删除或者更新造成的空间浪费。
1.分析表
analyze table 表名1
数据库系统会对表加一个只读锁,在分析期间,只能读取表中的记录,不能更新和插入记录。analyze table语句能够分析innodb和myisam类型的表。
2.检查表
check table 表名【option】
检查表是否存在错误,能够检查innodb和myisam类型的表
但option只对mysiam类型有效。option -----quick\fast \changed\medium\extended
3.优化表
optimize table 表名1
INNODB和myisam表可以,只能优化表中varchar.blob,test类型字段。
如果一个表使用了test\blob这样的数据类型,那么更新、删除等操作就会造成磁盘空间的浪费。因为,更新和删除操作后,以前分配的磁盘空间不会自动收回,使用optimize table语句就可以将这些磁盘碎片整理出来,以便以后再利用。