MySQL Optimization Part 5 - Optimization Tips
目录
对于大量插入的数据(比如把一张表的数据导入另一张表中,一般都是 MySQL 管理员干的事):
对于 MyISAM 存储引擎,建议先把索引禁用。否则会一边导入数据,一边建立索引。
alter table table_name disable keys; loading data//insert语句; alter table table_name enable keys;
对于 InnoDB 存储引擎
- 将导入的数据按照主键排序
- set unique_checks=0; //关闭唯一性校验
- set autocommit=0; // 关闭自动提交
常见 SQL 语句优化小技巧
- 在使用 group by 分组查询是,默认分组后,还会排序,可能会降低速度. 在 group by 后面增加 order by null 就可以防止排序.
有些情况下,可以使用连接来替代子查询。因为使用 join,MySQL 不需要在内存中创建临时表。
select * from dept, emp where dept.deptno=emp.deptno; // 简单处理方式 select * from dept left join emp on dept.deptno=emp.deptno; //左外连接,更ok!
如果想要在含有 or 的查询语句中利用索引,则 or 之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引。
减少额外的排序,通过索引直接返回有序数据。WHERE 条件和 ORDER BY 使用相同的索引,并且 ORDER BY 的顺序和索引顺序相同,并且 ORDER BY 的字段都是升序或者降序。否则肯定需要额外的排序操作,带来 Filesort。
// 以下 SQL 可以使用索引 SELECT * FROM tablename ORDER BY key_part1, key_part2,...; SELECT * FROM tablename WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM tablename ORDER BY key_part1 DESC, key_part2 DESC; // 以下 SQL 不会使用索引 SELECT * FROM tablename ORDER BY key_part1 DESC, key_part2 ASC; --- order by 的字段混合 ASC 和 DESC SELECT * FROM tablename WHERE key2=constant ORDER BY key1; --- 用于查询行的关键字与 ORDER BY 中所使用的不相同 SELECT * FROM tablename ORDER BY key1, key2; --- 对不同的关键字使用 ORDER BY;
尽量只使用必要的字段,SELECT 具体的字段名称而不是 SELECT * 选择所有字段,这样可以减少排序区的使用,提高 SQL 性能,。
如何选择mysql的存储引擎
在开发中,我们经常使用的存储引擎 myisam / innodb/ memory
MyISAM 存储: 如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. ,比如 bbs 中的 发帖表,回复表.
InnoDB 存储: 对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.
MyISAM 和 INNODB的区别
- 事务安全
- 查询和添加速度
- 支持全文索引
- 锁机制
- 外键 MyISAM 不支持外键, INNODB支持外键. (在PHP开发中,通常不设置外键,通常是在程序中保证数据的一致)
Memory 存储: 比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快.
如果你的数据库的存储引擎是myisam,请一定记住要定时进行碎片整理
# 举例说明:
create table test100(id int unsigned ,name varchar(32))engine=myisam;
insert into test100 values(1,’aaaaa’);
insert into test100 values(2,’bbbb’);
insert into test100 values(3,’ccccc’);
# 我们应该定义对myisam进行整理
optimize table test100;
选择合适的数据类型
- 在精度要求高的应用中,建议使用定点数来存储数值,以保证结果的准确性。deciaml 不要用float
- 对于存储引擎是MyISAM的数据库,如果经常做删除和修改记录的操作,要定时执行optimize table table_name;功能对表进行碎片整理。
- 日期类型要根据实际需要选择能够满足应用的最小存储的日期类型