MySQL Optimization Part 5 - Optimization Tips

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 语句优化小技巧

  1. 在使用 group by 分组查询是,默认分组后,还会排序,可能会降低速度. 在 group by 后面增加 order by null 就可以防止排序.
  2. 有些情况下,可以使用连接来替代子查询。因为使用 join,MySQL 不需要在内存中创建临时表。

        select * from dept, emp where dept.deptno=emp.deptno; // 简单处理方式
        select * from dept left join emp on dept.deptno=emp.deptno; //左外连接,更ok!
  3. 如果想要在含有 or 的查询语句中利用索引,则 or 之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引。

  4. 减少额外的排序,通过索引直接返回有序数据。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 的字段混合 ASCDESC
    SELECT * FROM tablename WHERE key2=constant ORDER BY key1;
    --- 用于查询行的关键字与 ORDER BY 中所使用的不相同
    SELECT * FROM tablename ORDER BY key1, key2;
    --- 对不同的关键字使用 ORDER BY;
  5. 尽量只使用必要的字段,SELECT 具体的字段名称而不是 SELECT * 选择所有字段,这样可以减少排序区的使用,提高 SQL 性能,。


如何选择mysql的存储引擎

在开发中,我们经常使用的存储引擎 myisam / innodb/ memory

MyISAM 存储: 如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. ,比如 bbs 中的 发帖表,回复表.

InnoDB 存储: 对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.

MyISAM 和 INNODB的区别

  1. 事务安全
  2. 查询和添加速度
  3. 支持全文索引
  4. 锁机制
  5. 外键 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;功能对表进行碎片整理。
  • 日期类型要根据实际需要选择能够满足应用的最小存储的日期类型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章