# 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 | select * from dept left join emp on dept.deptno=emp.deptno; [左外连接,更ok!] |
- 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引,应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
1 | 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 的区别
- 事务安全(MyISAM 不支持事务,INNODB 支持事务)
- 查询和添加速度(MyISAM 批量插入速度快)
- 支持全文索引(MyISAM 支持全文索引,INNODB 不支持全文索引)
- 锁机制(MyISAM 时表锁,innodb 是行锁)
- 外键 MyISAM 不支持外键, INNODB 支持外键. (在 PHP 开发中,通常不设置外键,通常是在程序中保证数据的一致)
Memory 存储,比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用 memory, 速度极快. (如果 mysql 重启的话,数据就不存在了)

如果你的数据库的存储引擎是 myisam, 请一定记住要定时进行碎片整理
举例说明:
1 | create table test100(id int unsigned ,name varchar(32))engine=myisam; |
我们应该定义对 myisam 进行整理
1 |
|