SQL语句优化常见技巧
其实SQL语句的优化核心就在避免全表扫描上面
- 对查询语句优化,避免全表扫描
- 首先应考虑在
where
及order by
涉及的列上建立索引 - 避免在
where
子句中对字段进行表达式和函数操作(避免where
进行null、!=、>= 、<=
等运算导致的全表扫描) - 在
group by
后面增加order by null
就可以防止group by
的默认排序 (默认排序可能会降低速度) - 使用
JOIN
连接代替子查询 (JOIN
不会在内存创建临时表,子查询会) - 避免对没有索引使用
or
导致索引失效而全表扫描(union
可以代替就用union
) - 慎用
in
和not in
( 考虑是否可以exists
代替in
) - 查询数据的范围限制(如果只要一条,语句结尾加上
limit 1
) - 禁止使用
like %开头
方式的模糊查询 (考虑全文索引) - 禁止使用
select *
方式查询数据 (要什么列就写什么列) - 创建字段时给予默认值(避免查询的时候
where colum = null
的情况出现)
《SQL 连接的区别》
《联合查询 union和union all的区别》
表设计技巧
- 遵守三大范式
- 适当的根据项目设计特殊列(反范式)
- 字段、索引越少越好
- 字段过多时分隔成两个表
- 字段类型选择(合适的类型能够节省空间及避免设计不当导致coding时的问题)
- 合适的索引(索引建在小字段上,对于大的文本字段甚至超长字段,不建索引)
- 尽量避免字段值允许为
NULL
- 尽量避免使用主外键
- 每张表一定要有
id
- 使用
PROCEDURE ANALYSE()
分析表(mysql会给出你相关建议) - 正确的选择引擎 (MyISAM和InooDB)
MyISAM和InooDB的区别?
属性名称 | MyISAM | InooDB |
---|---|---|
事务 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
锁机制 | 表锁 | 行锁 |
主外键 | 不支持 | 支持 |
这几个点的区别比较明显,省略其他的…
数据库备份
手动方式
Windows下的话配置好环境变量,用命令备份(source
命令恢复)
Linux下的话进入到执行目录和windows一样用命令操作
备份语法:mysqldump –u -账号 –密码 数据库 [表名1 表名2…] > 文件路径
恢复语法:source 文件路径
自动(定时任务)方式
自动方式其实说白了就是定时方式嘛,无论是Windows
还是Linux
都是一样的思路。先编写脚本 (.bat
/.sh
脚本) 然后通过其他方式定时执行。 windows
的话找到任务计划程序创建任务即可,inux
的话可以通过 crontab
来完成。网上有很多相关的,看一遍就懂。
tips:SQL优化这方面还是要去积累,久了就有经验了,技巧是很多的学不完的毕竟。