MySQL查询优化方案汇总(索引相关)

索引相关

类型隐式转换 大坑

**字段filed1是varchar类型,且加了索引,如果 where filed1 = 123; type 可能是all,因为123是数字类型,mysql内部会用函数做隐式转换,用了函数,索引就失效了。**

大数据深度分页,用主键

select field1,field2 from table limit 100000,10;
select field1,field2 from table where id > 100000 limit 10;

避免使用MySQL函数

MySQL内置了很多函数,使用函数可能导致索引失效,尽量让MySQL只做简单的增删改查。

避免类型的隐式转换

varchar等字符串类型的字段被加了索引,把这字段当做where条件,及时目标值是数字,也要加引号,否则类型的隐式转换,会引起索引失效的问题。

避免使用函数或表达式,尽量只让数据库做纯粹的增删改查。

用函数的前提是知道初始值,然后在操作数据,很多函数都是要传参的,所以mysql只能全表查,然后每次迭代将数据丢给函数处理。
表达式也是如此,例如where number + 1 = 10,都会让索引失效。

避免使用不等值做排除法

避免使用<>!=not inis not null、这些都会使索引失效。

避免使用null值

避免字段使用null值,一是影响索引(mysql建索引建的是非null的值,大量的null值影响了正常的B+tree结构),而且造成聚合函数统计(如count(该字段))不准确的问题。

索引无关

减少大字段查询,避免使用*,不说磁盘io的损耗,连网络带宽都跟着损耗。
如果只select仅需字段,可能会触发覆盖索引机制,不用回表,提高性能。

select * from table;
select field1,field2 from table;

查询是否存在

select count(*) from table where...;
select field from table where ... limit 1;

冗余优化

想要查询一篇文章的浏览量,不用count(浏览记录)。
新建一个在文章表中建立一个浏览量的字段,这使得查询的时间复杂度从O(n)变成O(1)

避免join,适用于大表关联小表。

如果想要join的两个表,一个很大,一个很小,应尽量避免join。
可将小表数据全部取出来组装成数组,放入编程语言的内存,用编程语言的内存匹配的方式去关联。

哪些场景下索引会失效

  • 使用not in、is not null、<>、!=、这种排除法时会导致索引失效,覆盖索引除外。
  • 最左匹配原则,左边的字段缺少时会出现,覆盖索引除外。
  • 最左匹配原则,左边的字段有区间查询,导致右边的字段无法使用索引。
  • like左边或两边加百分号。
  • 类型的隐式转换,如varchar的字段,使用where varchar_field = 123,包括join表,用on连接的字段。
  • where条件有函数,或表达式。
  • where语句包含or,or中存在非索引列。
  • 大数据量对二级索引字段排序,如果select * 或者其它字段,这个过程涉及回表,可能无法使用索引,因为数据量大,走索引的每条数据都需要回表,代价会很大。
  • order by字段,如果排序与索引顺序不一致,则可能导致索引失效,如果order by的每个字段,都按照索引的顺序,或者反顺序,则仍旧会走索引。

那些查询适合创建索引?

  • 需要唯一性约束兜底的字段。
  • 经常被查询或者作为where条件的字段,=、>、<、<=、>=、in、between、like 右百分号。
  • 经常group by或者order by的字段。
  • delete或update被作为where条件的字段。
  • distinct的字段。
  • join on的连接字段需要加索引,但是需要类型一致,因为MySQL内部有用函数做隐式转换,用了函数就不适用索引。
  • 区分度(不重复度)高的字段。
  • 把搜索最频繁的列,放在联合索引的左侧,(受联合索引的最左原则影响)。

那些查询不适合创建索引?

  • 数据量小,一个表,例如配置表,总类别表,可能最多几十条记录,创建不创建区别不大。
  • 写多读少,数据的写操作对索引字段的开销比没有索引要大,而且读操作还少。
  • 区分度低的字段,例如性别状态等,这会导致线性查找,能提升搜索效率,但是不明显,可加可不加。
  • sql语句包含<>、!=、not in、is not null,无法使用索引,所以专门用作排除性查找的,不建议创建索引。

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

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

相关文章

【技术干货】教你如何基于华为昇腾CANN架构快速实现模型推理应用(内含视频教程)

昇腾的AI全软件栈平台、开源框架、CANN、MindSpore、MindX 等工具&#xff0c;可以让开发者实现「统一端边云&#xff0c;全端自动部署」&#xff0c;开启了机器学习开发的新时代&#xff0c;一直被人们寄予厚望。但正因为资源极其丰富&#xff0c;浩如星辰&#xff0c;想要快速…

使用Python进行股票分析(1)

简介 Python具有非常好的数据分析和数据可视化的功能。在本文中&#xff0c;我们将通过使用Python获取股票的闭市价格&#xff0c;并且对股票价格进行分析从而向我们提供买卖股票的依据。 数据获取 需要说明的是在这里我们获取的是美国股票的数据。至于中国股市的数据大家可…

LeetCode 第53天 | 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和 PTA一些注意点 动态规划

1143. 最长公共子序列 最长公共子序列和最长公共子数组的区别在于&#xff0c;dp中子序列可以不连续&#xff0c;可以从左上&#xff08;text1[i-1] text2[j-1]&#xff09;推出&#xff0c;也能从左边或者上边&#xff08;取最大值&#xff09;推出&#xff1b;公共子数组只能…

前端状态码报错(解析)

400系列状态码 - 客户端错误&#xff01; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 400 Bad Request 描述&#xff1a;这是一个通用的错误响应&#xff0c;表示服务器无法理解请求由于无效的语法。实例&#xff1a;…

【C语言】左旋字符串(三种实现方式)

题目&#xff1a; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法一&#xff1a; 我们画个图分析一下&#xff1a; 基本逻辑&#xff1a; 就是我们每一次旋转之前&#xff0c;我们就取出…

pip install和conda install的区别

先说结果&#xff1a;日常对于python的学习和简单项目推荐使用pip安装&#xff0c;效率更高&#xff0c;也不会有很多依赖问题。 首先&#xff0c;无论是conda还是pip&#xff0c;它们都属于包管理工具&#xff0c;直白点来说就是用来下载东西的。 二者的区别主要有以下几点&…

蓝桥杯——web(ECharts)

ECharts 初体验 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><script src"echarts.js">&l…

《JAVA与模式》之观察者模式

系列文章目录 文章目录 系列文章目录前言一、观察者模式的结构二、推模型和拉模型三、JAVA提供的对观察者模式的支持四、怎样使用JAVA对观察者模式的支持前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

入门学习Python推荐书籍

. Python作为一门易学易用的编程语言&#xff0c;在近些年得到了越来越多的关注和应用。Python的开发效率极高&#xff0c;语言特性丰富&#xff0c;拓展性强。因此&#xff0c;Python成为了众多IT工程师、科研人员、数据分析师以及爱好者的首选。 那么&#xff0c;对于初学者…

vite项目修改node_modules

问题详情 在使用某个依赖的时候遇到了bug&#xff0c;提交issue后不想一直等待到作者更新版本&#xff0c;所以寻求临时自己解决 问题解决 在node_modules里找到需要修改的依赖&#xff0c;修改想要修改的代码 修改后记得保存 然后在node_modules里找到.vite文件夹&#x…

docker快照备份回滚

1. 安装系统 1.1 vm安装Ubuntu 参考:https://blog.csdn.net/u010308917/article/details/125157774 1.2 其他操作 添加自定义物理卷 –待补充– 1.2.1 查询可用物理卷 fdisk -l 输出如下 Disk /dev/loop0: 73.9 MiB, 77492224 bytes, 151352 sectors Units: sectors of …

耐腐蚀PFA消解管可配四氟回流盖适配海能莱伯泰科全自动石墨消解仪

PFA消解管&#xff0c;也叫PFA消化管、特氟龙消解管、耐高温消解杯等&#xff0c;应用于气相、液相、等离子光谱质谱、原子吸收、原子荧光等化学分析方法的样品前处理&#xff0c;可消解重金属、农残、食品、淤泥、稀土、水产品、有机物等。 PFA消解管 PFA消解管可耐强酸、强碱…

基于单片机的红外测距仪设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 主控制器选择 3 1.2 项目总体设计 3 2 项目硬件设计 5 2.1 单片机控制模块 5 2.2 测距模块设计 9 2.3 液晶显示模块 10 2.4 报警模块 11 3 项目软件设计 12 3.1 软件开发环境 12 3.2 系统主程序设计 13 3.3 LCD显示程…

Spring Boot 生成与解析Jwt

Spring Boot 生成与解析Jwt Maven依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>生成&解析 package yang;import io.jsonwebtoken.Claims…

收银系统源码-智慧新零售2.0小助手全新升级!

欢迎后台私信&#xff0c;测试体验&#xff01; 新零售助手是智慧新零售系统的移动管理端&#xff0c;尤其针对商户/门店日常经营必不可少的一环。智慧新零售2.0版小助手也进行了全新升级&#xff0c;使用起来更简单&#xff0c;页面更美观。小助手采用微信小程序登陆&#xf…

第六讲:什么是期货合约、永续合约

什么是期货合约 期货合约 &#xff1a; 是买方和卖方的一个约定&#xff0c;在将来的某个时间&#xff0c;以某个价格对某个货物进行交易 比如农民会种植农作物&#xff0c;粮商收购农作物。农民会和粮商 签订期货合约 卖货的一方&#xff0c;属于做空单。买货的一方&#x…

SQL27 查看不同年龄段的用户明细

题目描述 题目&#xff1a;现在运营想要将用户划分为20岁以下&#xff0c;20-24岁&#xff0c;25岁及以上三个年龄段&#xff0c;分别查看不同年龄段用户的明细情况&#xff0c;请取出相应数据。&#xff08;注&#xff1a;若年龄为空请返回其他。&#xff09; 示例&#xff…

OceanBase社区版单节点安装搭建(Docker)

OceanBase社区版单节点安装搭建&#xff08;Docker&#xff09; 文章目录 OceanBase社区版单节点安装搭建&#xff08;Docker&#xff09;一、环境检查及Docker配置1.1 安装docker1.2 配置docker镜像源 二、OB镜像下载三、obd部署单节点数据库四、创建业务租户、数据库、表4.1 …

vsto给excel赋值最快的方式是什么

在 VSTO (Visual Studio Tools for Office) 中&#xff0c;给 Excel 赋值最快的方式通常是通过使用数组进行批量操作。直接将数据数组赋值给 Excel 范围&#xff0c;而不是逐个单元格地进行操作&#xff0c;可以显著提高性能。以下是一个简单的示例&#xff1a; csharp // 假设…

Git 掌握

目录 一、前言 二、centos安装Git 三、Git基本操作 (1) 创建Git本地仓库 (2) 配置Git (3) 认识工作区&#xff0c;暂存区&#xff0c;版本库 四、添加文件 五、查看.git文件 六、修改文件 七、版本回退 八、撤销修改 (1) 场景一 对于还没有add的代码 (2) 场景二 已…