外观
优化数据库结构
数据库结构是否合理,需要考虑是否存在冗余,对表的查询和更新速度如何、表中字段的数据类型是否合理等多方面的内容。本节将介绍优化数据库结构的方法。
将字段很多的表分解成多个表
有些表在设计时设置了就包含很多字段,其中有的字段使用频率很低,那么当这个表的数据量很大时,查询数据的速度就会变慢,对于这种字段特别多的表,就可以将使用频率低的字段分解成多个新的表。
增加中间表
有的时候经常查询两个表中的好几个字段,若经常进行连表查询,会降低MySQL的查询速度。这种情况下,可以建立中间表来提高查询速度。我们需要先分析最可能同时查询表中的哪几个字段,然后将这些字段建立为一个中间表,并将原来的几个数据插入中间表中,之后就可以使用中间表进行查询和统计。
如我们查看以下学生表tb_student和班级表tb_classes的结构,结果如图。

实际应用中,我们常常查询学号、姓名和班级。根据这个情况,可以创建一个temp_student表,temp_student表中存储三个字段,分别是id、name和classname。创建以及插入记录的语句如下。
create table temp_student(
id int not null,
name varchar(50) not null,
classname varchar(45)
);
insert into temp_student select s.id,s.name,c.name from tb_student as s,tb_classes as c where s.class_id = c.id;
select * from temp_student;
优化插入记录的速度
索引、唯一性检验都会影响插入数据的速度,是因为每次都要进行排列以及检验,而且一次插入和多次插入的速度是不一样的。
禁用索引
若索引开启,则插入数据的速度会变慢,若插入大量数据时应先关闭索引,待插入完成后再次开启索引,关闭索引的语法如下。
ALTER TABLE table_name DISABLE KEYS;重新开启索引的方法如下。
ALTER TABLE table_name ENABLE KEYS;对于新创建的表,可以先不创建索引,等到记录都导入以后再创建索引,这样可以提高插入数据的速度。
禁用唯一性检查
唯一性检查开启时,MySQL会对插入的数据进行检验,这也会降低插入记录的速度。可以在插入记录前禁用唯一性检查,待记录完成后再开启,禁用唯一性检查的语法如下。
SET UNIQUE_CHECKS = 0;重新开启唯一性检查的语法如下。
SET UNIQUE_CHECKS = 1;优化INSERT语句
在插入多条语句时,若要插入多条记录,则将这些数据放在一条INSERT语句中的方式要比多条INSERT语句,每条INSERT语句只包含一个记录的方式要快。如下面。
insert into tb values (v1),(v2),... -- 方式一
insert into tb values v1; -- 方式二
insert into tb values v2;
...在上面的例子中,方式一就比方式二快,因为方式一不需和数据库进行多次连接。
当插入大量数据时,建议使用一个INSERT语句插入多条记录的方式。而且若能够使用LOAD DATA INFILE语句就尽量使用该语句,因为该语句比INSERT语句更快。
分析表、检查表和优化表
分析表的主要作用是分析关键字的分布。检查表的主要作用是检查表是否存在错误。优化表的主要作用是消除删除或更新操作带来的空间浪费。
分析表
MySQL中使用ANALYZE TABLE语句来分析表,该语句的语法如下。
ANALYZE TABLE table_name1[,table_name2,...];使用ANALYZE TABLE语句分析表的过程中,数据库系统会给表添加一个只读锁。在分析期间,只能读取表中的记录,不能更新和插入记录。ALALYZE TABLE语句能分析InnoDB和MyISAM类型的表。如我们分析tb_bookinfo表,语法如下。
analyze table tb_bookinfo;
其中Table字段表示表的名称;op是operation的缩写,代表执行的操作,analyze代表分析操作,check代表检查查找,optimize代表进行优化操作;Msg_type代表信息类型,其显示的值通常是状态、警告、错误、信息中的一个;Msg_text显示信息。
检查表和优化表之后也会出现这4列信息。
检查表
MySQL使用CHECK TABLE语句检查表。CHECK TABLE语句可以检查InnoDB、MyISAM类型的表是否存在错误,而且还可以检查视图。该语句的语法如下。
CHECK TABLE table_name1[,table_name2,...][option];其中,参数option有五个可选项:QUICK、FAST、CHANGED、MEDIUM和EXTENTED。这五个选项的执行效率依次降低。option选项只对MyISAM表有效,对InnoDB表无效。CHECK TABLE语句在执行时也会给表添加只读表。
优化表
MySQL中使用OPTIMIZE TABLE语句来优化表。OPTIMIZE TABLE语句对InnoDB和MyISAM表都有效。但是该语句只能优化表中的VARCHAR、BLOB和TEXT字段。OPTIMIZE TABLE语句的语法如下。
OPTIMIZE TABLE table_name1[,table_name2,...];通过此语句可以消除删除和更新造成的磁盘碎片,从而减少空间的浪费。OPTIMIZE TABLE语句执行时也会给表添加只读表。
若一个表使用了TEXT或BLOB这样的数据类型,那么更新、删除等操作就会造成磁盘空间的浪费,因为更新和删除后,以前分配的磁盘空间不会自动收回。使用OPTIMIZE TABLE语句就可以将这些磁盘碎片整理出来,以便以后再次利用。