关于索引:索引可以提高查询速度,但并不是使用索引时,索引都会起作用。下列情况下,索引不会起作用
- like:使用like关键字的查询语句中,如果匹配字符串的第一个字符为% ,索引不会起作用。
- 组合查询:只有查询条件中使用了第一个索引字段,索引才会起作用
- or关键字:查询语句中条件中只有or关键字,且or前后两个条件中的列都是索引时,索引才会起作用。
优化子查询:使用子查询可以进行select语句嵌套,一个select的查询结果作为另一个select的输入。子查询使用起来很灵活,单执行效率不高。执行子查询时,mysql需要为内层查询结果建立一个临时表,然后外层查询从临时表中读取记录,查询完毕后,再撤销临时表。因此,子查询速度会受到一定影响。如果查询的数据量比较大,影响会随之增大。*****mysql中,可以使用连接查询代替子查询。连接查询不需要建立临时表,如果查询时使用索引,性能会更好。之所以性能更好,是因为mysql不需要在内存中建立临时表。
优化数据库结构
1.将字段很的表分解成多个表:对于字段很多的表,可以将使用频率很低的字段分离出来,形成新的表。
2.对于需要经常联合查询的表,可以建立中间表提高查询效率。把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,已提高查询效率
3.优化插入记录的速度:插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。
对MyISAM引擎:
(1)对于非空表,插入记录时,mysql会根据表的索引对插入的记录建立索引。如果插入大量数据,建立索引会降低速度。可以在插入之前禁用索引,插入完毕后再开启索引。对于空表不需要。
语句:ALTER TABLE table_name DISABLE KEYS;
(2)禁用唯一性校验,语句:
SET UNIQUE_CHECKS=0; 关闭
SET UNIQUE_CHECKS=0; 开启
(3)插入多条记录是,使用批量插入,不要使用分条插入。
(4)使用 load data infile,语
LOAD DATA INFILE file INTO TABLE table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';
InnoDB引擎:
(1) 禁用唯一性检查
(2)禁用外键检查
SET FOREIGN_KEY_CHECKS=0;
ET FOREIGN_KEY_CHECKS=1;
(3)禁止自动提交
SET AUTOCOMMIT=0;
SET AUTOCOMMIT=1;
分析、检查、优化表
- 分析表:ANALYZE TABLE table_name;
- 检查表:CHECK TABLE table_name;
- 优化表:OPTIMIZE TABLE table_name;
优化硬件