- 建议使用预编译语句进行数据库操作
- 预编译语句可以重复使用执行计划
- 可以有效避免动态 SQL 带来的 SQL 注入问题
- 只传参数,比传递 SQL 语句更高效
- 相同语句可以一次解析,多次使用,提高处理效率
- 避免数据类型的隐式转换
- 隐式转换会导致索引失效
- eg: select name,phone from customer where id = ‘111’
- 充分利用表上已经存在的索引
- 避免使用 双% 的查询条件。如 a like ‘%123%’
- 一个 SQL 只能利用到复合索引中的一列进行范围查询
- 使用 left join 或 not exists 来优化 not in 操作
- not in 会使索引失效
- 程序连接不同的数据库使用不同的账号,禁止夸库查询
- 为数据库迁移和分库分表留出余地
- 降低业务耦合度
- 避免权限过大而产生的安全风险
- 禁止使用 SELECT * ,必须使用 SELECT <字段列表> 查询
- 消耗更多的CPU和IO,以及网络带宽资源
- 无法使用覆盖索引
- 可减少表结构变更带来的影响
- 禁止使用不含字段列表的 INSERT 语句
- eg:insert into tb_xx values(a,b,c) 错误
- eg:insert into t(c1,c2,c3) values(a,b,c) 正确
- 避免因为字段变更,导致的插入失败
- 避免使用子查询,可以把子查询优化为 join 操作
- 子查询的结果集无法使用索引
- 子查询会产生临时表操作,如果子查询数据量大则严重影响效率
- 消耗过多的 CPU 及 IO 操作
- 包含 GROUP BY、ORDER BY 等操作的子查询,无法转换为 JOIN 操作
- 避免使用 JOIN 关联
太多
的表
- 每 JOIN 一个表会多占用一部分内存
- 会产生临时表操作,影响查询操作
- MySQl 最多允许关联 61 个表,建议不超过 5 个
- 减少同数据库的交互次数
- 数据库更适合处理批量操作
- 合并多个相同的操作到一起,可以提高处理效率
- eg:alter table t1 add column c1 int, change column c2 c2 int
- 使用 in 代替 or
- in 的值不要超过 500个
- in 操作可以有效的利用索引
- 禁止使用 order by rand() 进行随机排序
- 会把表中所有符合条件的数据装载到内存中进行排序
- 会消耗大量的 CPU 和 IO 及内存资源
- 推荐在程序中获取一个随机值,然后从数据库中获取数据的方式
- where 从句中禁止对列进行函数转换和计算
- 对列进行函数转换或计算会导致无法使用索引
- eg:where date(createtime) = ‘20160901’
- 这样的话,无法使用到 createtime 列上的索引
- 可以修改为:where createtime >= ‘20160901’ and createtime < ‘20160902’
- 在明显不会有重复值时使用 UNION ALL 而不是 UNION
- UNION 会把所有数据放到临时表中后再进行去重操作
- UNION ALL 不会再对结果集进行去重操作
- 拆分复杂的大 SQL 为多个小 SQL
- MySQL 一个 SQL 只能使用一个 CPU 进行计算
- SQL 拆分后可以通过并行执行来提高处理效率
- 拆分 SQL 之后,多个小 SQL 能够更好的利用 CPU 资源
- 需要拆分的 SQL 为书写复杂,且执行时间长的。避免因 SQL 执行过长导致处理效率缓慢。
《高性能MySQL》目录
- 第一章 数据库设计规范
- 第二章 数据库字段设计规范
- 第三章 数据库 SQL 开发规范
- 第四章 数据库操作行为规范
- 第五章 设计数据库分区表
- 第六章 MySQL存储引擎
- 第七章 MySQL 执行优化
- 第八章 MySQL 慢查询日志
- 第九章 MySQL 数据库备份与恢复
- 第十章 MySQL构架拆分
- 其他:MySQL表结构实践sql
- 其他2:MySQL常用命令
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凯!