1. sql调优
- 对查询进行优化, 避免全表扫描,首先应考虑在 where及order by涉及的列上使用索引
- 避免在where子句中对字段进行null值判断, 否则将导致引擎放弃使用索引而进行全表扫描,如:
select id form t where num is null
可以在num设置默认值0,确保表中的num列没有null值,然后这样查询
select id form t where num = 0
- 避免在where子句中使用!=或<>操作符, 否则引擎放弃使用索引而进行全表扫描.
- 避免在where子句中使用or来连接条件,如果一个字段有索引, 一个字段没有索引, 引擎将放弃使用索引而使用全表扫描,如:
select id from t where num=10 or name='admin'
可以这样查询:
select id from t where num = 10
union all
select id from t where name='admin'
- in 和 not in 也要慎用, 否则会导致全表扫描, 如
select id from t where num in(1,2,3)
对于连续的数值, 能用between不要用in
select id from t where num between 1 and 3
- 避免在where子句中对字段进行表达式或者函数操作,否则引擎放弃使用索引而进行全表扫描.
- 避免使用模糊查询, 可使用全文检索
- 避免使用 * , 使用具体字段代替 *
2. 引擎问题
特点 | Myisam | BDB | Memery | InnoDB | Archive | |
---|---|---|---|---|---|---|
存储限制 | 没有 | 没有 | 有 | 64TB | 没有 | |
事物安全 | 支持 | 支持 | ||||
锁机制 | 表锁 | 页锁 | 表锁 | 行锁 | 行锁 | |
B树索引 | 支持 | 支持 | 支持 | 支持 | ||
哈希索引 | 支持 | 支持 | ||||
全文索引 | 支持 | |||||
集群索引 | 支持 | |||||
数据缓存 | 支持 | 支持 | ||||
索引缓存 | 支持 | 支持 | ||||
数据可压缩 | 支持 | 支持 | ||||
空间使用 | 低 | 低 | N/A | 高 | 非常低 | |
内存使用 | 低 | 低 | 中等 | 高 | 低 | |
批量插入的速度 | 高 | 高 | 高 | 低 | 非常高 | |
支持外键 | 支持 |
- 最常使用的两种存储引擎
- Myisam存储引擎. 当create创建新表时, 为指定新表的存储引擎时, 默认使用Myisam. 数据文件和索引文件可以放置在不同的目录, 平均分布io, 获得更快的速度.
- innoDB(MySQL的默认引擎)存储引擎提供了具有提交, 回滚和崩溃恢复能力的事物安全, 但是对比 Myisam的存储引擎, InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引
- 如何选择合适的存储引擎
选择标准: 根据应用特点选用合适的存储引擎, 对于复杂的应用系统可以根据实际情况选择多种引擎进行组合.
- Myisam: 插件式存储引擎, 他是在web, 数据仓库和其他应用环境下最常使用的存储引擎之一
- InnoDB: 用于事物处理应用程序, 具有众多特性, 包括ACID事物支持
- Memory: 将所有数据保存在RAM中, 在需要快速查找引用和其他类似数据的情况下, 可提供极快的访问.
- Merge: 允许MySQLDBA或开发人员将一系列等同的Myisam表以逻辑方式组合在一起, 并作为一个对象引用他们, 对于诸如数据仓库等VLDB环境十分合适.
3. 数据持久化
- 数据持久化就是把内存中数据模型转化为存储模型
- 数据持久化的好处
- 程序代码重用性强, 即使更换数据库, 只需要更改配置文件, 不必重写程序代码
- 业务逻辑代码可读性强, 在代码中不会有大量sql语言, 提高程序可读性
- 持久化技术可以自动优化, 以减少对数据库的访问量, 提高程序运行效率