谈谈SQL的优化经验

目录

前言

表设计优化

索引优化

读写分离,主从复制优化

​编辑sql语句优化


前言

SQL调优在项目中是比较常见的,SQL调优不仅仅包括SQL语句的编写,其中还应包括了数据库的表设计,数据库的配置架构(主从复制,读写分离),索引的使用,当然在数据量如果很大的情况下还应包括分库分表这些,今天我们就来谈谈我在开发学习这方面的经验。

SQL调优是指通过对数据库系统中的SQL查询及设计架构进行分析、优化和改进,以提高查询性能、减少资源消耗、降低响应时间、提高系统稳定性和可靠性的过程。

表设计优化

合理的范式设计:根据业务需求和数据特点,进行合理的范式设计,避免数据冗余和不一致性,提高数据存储效率和可靠性。

适当的反范式设计:对于一些需要频繁查询的字段,可以考虑进行反范式设计,将相关字段冗余存储,以减少数据表连接的次数,提高查询性能。

合理选择字段类型:根据实际存储内容选择合适的字段类型,如整型、字符型、日期型等,以减少存储空间浪费和提高数据处理效率。

要根据字段的内容来选择合适的数据类型。对于数值类型的字段,可以根据实际情况选择合适的类型,例如:

  • TINYINT: 用于存储范围较小的整数,通常用于存储布尔值或者状态码等。
  • INT: 用于存储普通整数,通常用于存储计数器、ID等。
  • BIGINT: 用于存储范围较大的整数,通常用于存储较大的计数器、ID等。

对于字符串类型的字段,也需要根据存储内容来选择合适的类型,例如:

  • CHAR: 用于存储定长字符串,适合存储长度固定的字符串,例如国家代码、性别代码等。
  • VARCHAR: 用于存储可变长度字符串,适合存储长度不固定的字符串,例如姓名、地址等。
  • TEXT: 用于存储较大文本数据,适合存储大段文本、文章内容等。

优化索引设计:为常用的查询条件创建合适的索引,以加快查询速度,同时避免过多的索引导致更新性能下降。

优化主键设计:选择合适的主键,避免使用过长或者频繁变动的字段作为主键,以提高数据插入和更新的性能。

索引优化

索引是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

通俗来说, 索引就相当于一本书的目录, 可以根据页码快速查找到指定的内容, 目的就是加快数据库的查询速度,但这也就意味着书中如果要增加一个章节,修改目录是比较麻烦的,使用索引适用于经常查询很少修改的业务

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

1) 顺序访问

  • 顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
  • 顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

2) 索引访问

  • 索引访问是通过遍历索引来直接访问表中记录行的方式。
  • 使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
  • 注意: 建立索引后, 查询速度不一定会变快,例如, 你在teacher表中建立了关于id的索引, 如果你按照name查询, 那么查询速度也不会变快,查询得用到你建立的索引

读写分离,主从复制优化

MySQL读写分离是一种常见的数据库架构设计模式,用于解决高并发场景下数据库的性能和可扩展性问题。它通过将读操作和写操作分离到不同的数据库服务器上,实现了负载均衡和提高数据库性能的效果。

在MySQL读写分离模式中,通常有一个主数据库(Master)用于处理写操作,多个从数据库(Slaves)用于处理读操作。主数据库负责接收并处理所有的写请求,然后将写入的数据同步到从数据库。从数据库则负责处理读请求,提供查询功能。

①当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。

②salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。

③当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。

④I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。

⑤SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。

sql语句优化

  • 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描
  • 尽量避免使用in 和not in,会导致引擎走全表扫描
  • 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描
  • 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描
  • 尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描
  • 使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件。
  • 避免使用隐式类型转换,否则造成不使用索引
  • 避免使用SELECT *:只选择需要的列,避免不必要的数据传输和处理。
  • 避免使用通配符(*)选择所有列,而是只选择需要的列。使用WHERE子句限制返回的行数,避免不必要的数据传输和处理。
  • 多表关联查询时,小表在前,大表在后
  • 如果是聚合查询,尽量用union all代替union ,union会多一次过滤

MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pure::variants—产品平台化及变体管理工具

产品概述 pure::variants是德国pure-systems公司的产品&#xff0c;其目的是帮助企业实现对产品线的变体管理&#xff0c;提高企业项目资产的复用效率。pure::variants的核心理念是运用产品线管理方法对项目资产&#xff08;项目计划、需求、模型、功能模块、代码、测试用例&am…

如何将 MySQL 数据库转换为 SQL Server

本文解释了为什么组织希望将其 MySQL 数据库转换为 Microsoft SQL 数据库。本文接着详细介绍了尝试转换之前需要记住的事项以及所涉及的方法。专业的数据库转换器工具将帮助您快速将 MySQL 数据库记录转换为 MS SQL Server。 在继续之前&#xff0c;我们先讨论一下 MySQL 到 M…

Stable Diffusion WebUI常用Tag收集

捆绑(nsfw)*可以直接加人物lora Masterpiece, high quality, beautiful wallpaper, 16k, animation, illustration, positive perspective, perfect body, complete body, detailed face, delicate features, (solo:1.2), ((1girl)), thin, sexy, (medium to large breasts :1…

Linux(centos)学习笔记(初学)

[rootlocalhost~]#:[用户名主机名 当前所在目录]#超级管理员标识 $普通用户的标识 Ctrlshift放大终端字体 Ctrl缩小终端字体 Tab可以补全命令 Ctrlshiftc/V复制粘贴 / &#xff1a;根目录&#xff0c;Linux系统起点 ls&#xff1a; #list列出目录的内容&#xff0c;通常用户查看…

HTML试题——附答案

HTML试题题目 1. HTML是什么意思&#xff1f;它是什么类型的语言&#xff1f; 2. 请解释HTML标签和元素之间的区别。 3. 以下HTML标记用于什么目的&#xff1f; <!DOCTYPE html> <html> <head><title>我的网页</title> </head> <bo…

什么是 performance_schema ?

MySQL的performance_schema是运行在较低级别的用于监控MySQL Server运行过程中的资源消耗、资源等待等情况的一个功能特性&#xff0c;它具有以下特点。 performance_schema提供了一种在数据库运行时实时检查Server内部执行情况的方法。performance_schema数据库中的表使用per…

Redis研学-认识与安装

一 NoSql-非关系型数据库 1 NoSql特点&#xff1a;解耦 数据模型简单&#xff0c;灵活性更强&#xff0c;对数据库的性能要求比较高(可能出现数据不一致或丢数据)&#xff0c;不需要高度的数据一致性&#xff0c;对给定的key比较容易映射到更复杂的环境 优点&#xff1a; 对数…

WordPress发布文件随机设置作者昵称信息

我们是否看到有些明显是个人网站&#xff0c;但是他有很多的发布者。其实这个都是他个人发布的&#xff0c;只是选择的不同用户&#xff0c;感觉这个网站是多人编辑的。包括我们看到有些明显是采编采集的网站&#xff0c;他们就说是投稿的&#xff0c;实际上哪里有人投稿&#…

单片机开发常用的软件构架

对于单片机程序来说&#xff0c;大家都不陌生&#xff0c;但是真正使用架构&#xff0c;考虑架构的恐怕并不多&#xff0c;随着程序开发的不断增多&#xff0c;架构是非常必要的。 一、时间片轮询法 介于前后台顺序执行法和操作系统之间的一种程序架构设计方案。该设计方案需能…

Modbus TCP工业RFID读写器的选型要点

Modbus TCP工业RFID读写器是一种采用Modbus TCP通信协议的RFID读写器。它可以通过TCP/IP网络与计算机或其它设备进行通信&#xff0c;实现远程读取和写入RFID标签数据的目的。 与传统的RFID读写器相比&#xff0c;Modbus TCP工业RFID读写器具有更远的读写距离、更高的读写灵敏度…

DTD文档约束讲解及其使用案例

DTD&#xff08;Document Type Definition&#xff09;文档类型定义是一种用于描述XML文档结构的语法规则。它定义了XML文档的元素、属性和实体等的规范格式。在XML中&#xff0c;可以将DTD定义在XML文档中或者在一个单独的外部文件中&#xff0c;以便在多个XML文档中共享。 下…

Restarting Application Engine Programs 重新启动应用程序引擎程序

Restarting Application Engine Programs 重新启动应用程序引擎程序 A key feature of Application Engine is its built-in checkpoint and restart capabilities. If a program step terminates abnormally or fails, you can restart the request from the last successf…

Flink Flink数据写入Kafka

一、环境准备 官网地址 flink官方集成了通用的 Kafka 连接器&#xff0c;使用时需要根据生产环境的版本引入相应的依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><flink.version>1.14.6</flink.version&g…

CCF编程能力等级认证GESP—C++1级—20230611

CCF编程能力等级认证GESP—C1级—20230611 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)时间规划累计相加 答案及解析单选题判断题编程题1编程题2 单选题…

关于小红书商单变现的一些答疑

AI小红书商单训练营也过去1个月了&#xff0c;今天给大家汇总几个常遇到的问题&#xff0c;希望对大家在运营过程中有所帮助。 1.账号封面是否要统一模版&#xff1f; 为了让账号主页呈现整洁美观的效果&#xff0c;建议统一封面设计&#xff0c;视频开头可以设置一个固定画面…

景联文科技:高质量垂直领域数据集助力AI技术突破

随着人工智能技术的飞速发展&#xff0c;垂直领域数据集在提升模型性能、解决领域问题、推动创新应用以及提升竞争力等方面的重要性日益凸显。 提高模型性能&#xff1a;垂直领域数据集专注于特定任务或领域&#xff0c;使用这些数据集进行训练可以让模型更好地理解和解决特定领…

redis应用-分布式锁

目录 什么是分布式锁 分布式锁的基本实现 引入过期时间 引入校验id 引入lua 引入看门狗 引入redlock算法 什么是分布式锁 在一个分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于"线程安全"的问题. 而…

@Autowired注入多态

如IBizStudyService接口有多个实现类BizStudyServiceImpl和BizStudyServiceExImpl&#xff0c;在Autowired注入时要用Qualifier指定实现类名称。 Autowired Qualifier("BizStudyServiceImpl") private IBizStudyService bizStudyService; 在实现类定义时要加上名称…

【开源】基于Vue和SpringBoot的计算机机房作业管理系统

项目编号&#xff1a; S 017 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S017&#xff0c;文末获取源码。} 项目编号&#xff1a;S017&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

【QT】Qt类库的模块

目录 1.Qt基本模块 2.Qt附加模块 3.增值模块 4.技术预览模块 5.Qt工具 1.Qt基本模块 Qt基本模块是Qt在所有平台上的基本功能&#xff0c;它们在所有的开发平台和目标平台上都可用&#xff0c;在Qt5所有版本上是源代码和二进制兼容的。 Qtcore模块是Qt类库的核心&#xff0c;所有…