# SQL 优化技巧

  • 使用 group by 分组查询是,默认分组后,还会排序,可能会降低速度,
    在 group by 后面增加 order by null 就可以防止排序.
1
explain select * from emp  group by deptno order by null;
  • 有些情况下,可以使用连接来替代子查询。因为使用 join,MySQL 不需要在内存中创建临时表。
1
select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式]
1
2
select * from dept left join emp on dept.deptno=emp.deptno;  [左外连接,更ok!]

  • 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引,应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
1
2
select id from t where num is null

最好不要给数据库留 NULL,尽可能的使用 NOT NULL 填充数据库.

备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用 NULL。

不要以为 NULL 不需要空间,比如:char (100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL 也包含在内),都是占用 100 个字符的空间的,如果是 varchar 这样的变长字段, null 不占用空间。

可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:

select id from t where num = 0

# MySQL 数据引擎 myisam /innodb/ memory

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

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

MyISAM 和 INNODB 的区别

  1. 事务安全(MyISAM 不支持事务,INNODB 支持事务)
  2. 查询和添加速度(MyISAM 批量插入速度快)
  3. 支持全文索引(MyISAM 支持全文索引,INNODB 不支持全文索引)
  4. 锁机制(MyISAM 时表锁,innodb 是行锁)
  5. 外键 MyISAM 不支持外键, INNODB 支持外键. (在 PHP 开发中,通常不设置外键,通常是在程序中保证数据的一致)

Memory 存储,比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用 memory, 速度极快. (如果 mysql 重启的话,数据就不存在了)

Myisam注意事项

如果你的数据库的存储引擎是 myisam, 请一定记住要定时进行碎片整理

举例说明:

1
2
3
4
5
6
7
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 进行整理

1
2

optimize table test100;