热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySql数据库优化维度

  首先,正常来说一个业务对应的数据,有很多复杂的数据库操作。不管是刚开始的业务,还是越发复杂的业务,都需要考虑数据库的设计、性能,并如何去调优。

数据库设计步骤

选择合适数据库

  根据业务需求动向,分析业务数据的处理行为,分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)

数据表结构关系设计

  一些比较复杂的大业务,可通过一些方式拆分业务,合理的建立一个业务表之间的关系,以及利用一些技巧提高一些效率。
  1. 表结构要尽量遵循三范式的原则
  2. 如果分析查询表比较多,尤其是需要进行多表联查的时候(尽量减少多表联查),可以采用反范式进行优化。反范式采用空间换时间的方式,通过增加冗余字段提高查询的效率。
  3. 表字段的数据类型选择,关系到了查询效率的高低以及存储空间的大小。一般来说,如果字段可以采用数值类型就不要采用字符类型;字符长度要尽可能设计得短一些。针对字符类型来说,当确定字符长度固定时,就可以采用 CHAR 类型;当长度不固定时,通常采用 VARCHAR 类型。
  数据表的结构设计很基础,也很关键。好的表结构可以在业务发展和用户量增加的情况下依然发挥作用,不好的表结构设计会让数据表变得非常臃肿,查询效率也会降低。

查询优化

  看到一个sql的时候,首先需要考虑分析的是sql的业务逻辑是什么,想要干什么。
  在上一步设计好业务数据表结构之间的关系,则sql的逻辑将不会复杂,大多都是单表查询,极个别会联表查询。
主要的查询优化步骤
  1. 只要简单的看一下Sql语句是否符合规范
  2. MySQL中EXPLAIN执行计划分析
  3. 分析一下查询是否有回表问题
  4. 深度的看一下复杂语句(Group By、Order By等)是否跟索引有关系
  5. 检查数据库的配置,如Join_buffer、Buffer_pool等

Sql语句是否符合规范

  • 能够快速缩小结果集的 WHERE 条件写在前面,如果有恒量条 件,也尽量放在前面 ,例如 where 1=1
  (这个我觉得顺序没有太大关系)
  • 避免使用 GROUP BY、DISTINCT 等语句的使用,避免联表查询和子查询
  使用GROUP BY时,建议在建索引时考虑GROUP BY后面字段的顺序,减少排序,与 Order By类似,都可以利用索引来排序
  DISTINCT注意使用,后面的所有字段去重
  • 能够使用索引的字段尽量进行有效的合理排列
  适量建索引,过多也会产生问题,如:导致占有内存过多,Buffer_Pool占用
  • 针对索引字段使用 >, >=, =, <, <=, IF NULL 和 BETWEEN 将会 使用索引,如果对某个索引字段进行 LIKE 查询,使用 LIKE ‘%abc%’ 不能使用索引,使用 LIKE ‘abc%’ 将能够使用索引
  使用的时候尽量使用Explain分析一下是否真用上了(一般很准确的)
  • 如果在 SQL 里使用了 MySQL部分自带函数,索引将失效
  因为带函数了,谁知道你想咋转换,咋玩的,导致全表扫描,针对的是左边字段的函数,还有类型转换也会导致索引失效
  • 避免直接使用 select *,只取需要的字段,增加使用覆盖索引使用的可能
  注意覆盖索引,数据数量大,效果很明显
  • 对于大数据量的查询,尽量避免在 SQL 语句中使用 order by 字句
  用的时候注意利用索引,来减少排序
  • 连表查询的情况下,要确保关联条件的数据类型一致,避免嵌套子查询
  数量大的时候注意是否创建被驱动表的的索引 (INL)
  • 对于连续的数值,使用 Between 代替 In
  在数据范围连续的情况,推荐使用Between
  • 对于Exist和In的的使用需要注意实际业务数据大小
  In的内表全扫描,Exist外表全扫描。 外表小时用exist,内表小时用in。核心是尽量扫描小的数据,将大的数据使用索引
  • where 语句中尽量不要使用 CASE 条件
  会导致sql复杂,且不宜理解
  • 当只要一行数据时使用 LIMIT 1
索引使用
• 索引占磁盘空间,不要重复的索引,尽量短
• 只给常用的查询条件加索引
• 过滤性高的列建索引,取值范围固定的列不建索引
• 唯一的记录添加唯一索引
• 频繁更新的列不要建索引
• 不要对索引列运算
• 同样过滤效果下,保持索引长度最小
• 合理利用组合索引,注意索引字段先后顺序
• 多列组合索引,过滤性高的字段最前
• order by 字段建立索引,避免 filesort
• 组合索引,不同的排序顺序不能使用索引
• <>!=无法使用索引
参考地址:https://developer.aliyun.com/article/709387

推荐阅读
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
author-avatar
逝水无痕--
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有