热门标签 | 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

推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
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社区 版权所有