mysql查询优化

1.count优化

a语句当行数超过11行的时候需要扫描的行数比b语句要多, b语句扫描了6行,此种情况下,b语句比a语句更有效率。

当没有where语句的时候直接select count(*) from world.city这样会更快,因为mysql总是知道表的行数。

2.数据不兼容会拉低效率

例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。

在方案中,保证在实现功能的基础上,尽量减少对数据库的访问次数。

[En]

In the program, it is guaranteed to minimize the number of visits to the database on the basis of realizing the function.

通过搜索参数,最小化了表的访问行数,最小化了结果集,从而减轻了网络负担。

[En]

By searching parameters, the number of rows accessed to the table is minimized and the result set is minimized, thus reducing the burden on the network.

可以尽量分开处理单独的操作,提高每次的响应速度。

[En]

Separate operations can be handled separately as far as possible to improve the response speed each time.

在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;

在查询时,不要过多地使用通配符如 SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;

在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。

不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;按照特定顺序提取数据的查找。

3.索引列进行运算会让索引失效

如下:b语句进行了运算,会使索引失效,从而降低查询效率

4.避免使用 !=/<>/is null/is not null/in/not in等这样的操作符
使用这类操作符会使系统无法使用索引,而只能直接搜索表中的数据

a语句使用了in关键字,会降低效率

5.尽量使用数字类型的字段
数字类型占用内存小
对于字符串类型,数值类型很容易比较

[En]

For string types, numeric types are easy to compare

较长的数据使用字符串(如ID号、电话号码等)

[En]

Longer data uses strings (such as ID numbers, phone numbers, etc.)

6.合理使用where < 0 和 exists

b语句查询速度高于a语句

7.能使用between,就不使用in。(连续的范围,可以使用索引,between…and…)

8.能使用distinct(去重),就不使用group by(分组)

9.尽量不要使用select into语句,该语句会导致’表锁定’,组织其他用户访问

10. 强制使用索引

11. 消除顺序读取,使用索引

12. 模糊查询(where like)时, 字母打头’a%’会使用索引,非字母打头’%a%’不会使用索引

13.虽然UPDATE、DELETE语句的写法基本固定,但是还是对UPDATE语句给点建议:

a) 尽量不要修改主键字段。

b) 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。

c) 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。

d) 避免UPDATE将要复制到其他数据库的列。

e) 避免UPDATE建有很多索引的列。

f) 避免UPDATE在WHERE子句条件中的列。

14.能使用union all,就不要使用union
union会默认进行去重、排序操作,会降低效率

UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源 在跨多个不同的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。

UNION ALL可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是一样的,但UNION ALL不会进行排序。

15. 字段数据类型优化:
a. 避免使用NULL类型:NULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。

b. 尽可能使用更小的字段,MySQL从磁盘读取数据后是存储到内存中的,然后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效率都更好,但也不要太过执着减小数据类型,要是以后应用程序发生什么变化就没有空间了。修改表将需要重构,间接地可能引起代码的改变,这是很头疼的问题,因此需要找到一个平衡点。

c. 优先使用定长型

Original: https://www.cnblogs.com/komorebiZjh/p/16186673.html
Author: 搁浅的小鲸鱼
Title: mysql查询优化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505454/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 慢SQL,压垮团队的最后一根稻草!

    一、什么是慢 SQL 什么是慢SQL? 顾名思义,运行时间较长的 SQL 语句即为慢 SQL! 那问题来了,多久才算慢呢? 这个慢其实是一个相对值,不同的业务场景下,标准要求是不一…

    数据库 2023年6月14日
    092
  • mysql8主从配置

    一、一般配置主从(这里主是m3300,从是3301、3302) 1.配置m3301 从mysql8里拿出这两个文件到m3301 2.配置my.ini &#x521D;&am…

    数据库 2023年5月24日
    077
  • ubuntu设置时区

    posted @2022-06-21 08:30 一份人间烟火 阅读(2 ) 评论() 编辑 Original: https://www.cnblogs.com/zcxxcvbn/…

    数据库 2023年6月9日
    086
  • python_Xpath入门

    下面列出了最有用的路径表达式: 表达式 nodename 选取此节点的所有子节点。 从根节点选取。 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 选取当前节点。 选取…

    数据库 2023年6月11日
    061
  • MySQL45讲之幻读

    前言 本文介绍了什么是虚读,虚读存在的问题和解决方法,以及间隙锁带来的麻烦。 [En] This paper introduces what is phantom reading,…

    数据库 2023年5月24日
    076
  • MySQL事务基本使用

    1 事务概述 1.1 事务的支持情况 1.2 事务的特性 1.3 事务的状态 2 使用事务 2.1 显示事务 2.2 隐藏事务 3 事务隔离等级 3.1 数据并发问题 3.2 事务…

    数据库 2023年6月9日
    096
  • 看看你离世界一流大厂有多远?3道Google最新SQL面试题 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析◉技能提升系列:https://www.showmeai.tech/tutorials/33📘 AI 面试题库系列:https://w…

    数据库 2023年6月14日
    068
  • macOS快捷键

    1. 最小化所有应用程序 command+option+h+m 2. 同应用窗口切换 command &#xFF5E; 3. 截图 "&#x5168;&a…

    数据库 2023年6月14日
    065
  • 微信登录前端开发指南

    使用场景 微信公众号内嵌H5网页调用微信登录 在微信浏览器中的网页唤起微信登录界面 详情可以查阅微信登录官方文档 链接地址 功能思路 后台先在微信给开发者提供的测试账号平台上创建应…

    数据库 2023年6月11日
    069
  • Linux进程管理

    进程管理 基本概念介绍 进程和线程 进程: 一个在内存中运行的应用程序,每一个进程都有自己独立的一块内存空间,并被分配一个ID号(PID),在Windows下可以打开任务管理器查看…

    数据库 2023年6月16日
    0100
  • Mybatis基础知识大全!!!

    1. 简介 1.1什么是Mybatis 1.2 如何获得Mybatis 1.3 使用Mybatis的好处: 2.初涉Mybatis 2.1环境搭建 2.2、创建一个模块(项目) 2…

    数据库 2023年6月16日
    0103
  • 不同分层中的对象的使用

    在项目中,控制层,业务层,数据层,视图层(返回值)。中分别使用了的对象,暂时不太理解这样做的好处,先记录下来。 如下: 控制层:也可以叫做入参对象, UserQuery userQ…

    数据库 2023年6月11日
    057
  • 分布式锁的实现

    什么是分布式锁? 为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLo…

    数据库 2023年6月6日
    099
  • Spring(一)-初识 + DI+scope

    1、获取bean实例的三种方式 UTF-8 4.3.18.RELEASE 1.16.18 4.11 org.springframework spring-beans ${sprin…

    数据库 2023年6月16日
    074
  • Python 学习笔记(七)–socket

    1.网络七层模型及主要协议 2.TCP的”三次握手”和四次挥手 三次握手 Step1:首先客户端向服务器端发送一段TCP报文; Step 2:服务器端接收到…

    数据库 2023年6月16日
    0105
  • MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的”精通MYSQL等数据库及优化” 那么我们今天就先来了解一…

    数据库 2023年5月24日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球