首页 > 数据库 >MySQL查询优化方案汇总(索引相关)

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

时间:2024-03-08 11:57:48浏览次数:30  
标签:函数 汇总 查询 索引 MySQL null where select

索引相关

类型隐式转换 大坑

**字段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 in、is 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,无法使用索引,所以专门用作排除性查找的,不建议创建索引。

标签:函数,汇总,查询,索引,MySQL,null,where,select
From: https://www.cnblogs.com/phpphp/p/18060671

相关文章

  • Linux 安装MySQL
    参考1.安装MySQLsudoapt-getinstallmysql-client-core-8.0sudoapt-getinstallmysql-server#安装MySQL数据库sudoapt-getinstalllibmysqlclient-dev#安装MySQL开发包安装新版本mysql,root密码是随机的,也不是空密码,所以要通过查看随机密码进入,再......
  • JavaScript 常用取整、四舍五入方法汇总
    https://juejin.cn/post/7184257661339172919  2023-01-0314,624阅读2分钟 在JavaScript中,对数值进行四舍五入操作的场景有以下几种:向上取整:ceil向下取整:floor四舍五入:round固定精度:toFixed固定长度:toPrecision取整:parseInt1.向上取整:ceilceil是天花板......
  • MySQL常用语句
    目录1.创建数据库2.删除数据库3.使用数据库4.创建表5.删除表6.插入数据7.查询数据8.更新数据9.删除数据10.连接两个或多个表11.排序数据12.限制返回的数据数量13.创建索引14.删除索引15.创建主键16.删除主键17.创建外键18.删除外键1.创建数据库CREATEDATA......
  • Mysql-索引
    主键索引:表的主键为B+Tree的key。二级索引:二级索引的value是表的主键,这样做的好处是B+Tree的节点小,可以一次放入更多节点到内存,减少IO次数。缺点是需要回表:通过二级索引查到的主键,再去主键索引查需要的信息。聚簇索引:索引结构和数据一起存放的索引,InnoDB中的主键索引......
  • MySQL Server架构概述
    推荐:SQL语句执行顺序相关问题。MySQLServer架构分层概述MySQLServer架构可抽象为3层。连接层:验证用户名密码,认证成功后,获取当前账号的权限并缓存,并分配TCP连接池和线程池资源。处理层:实现核心的处理功能。存储层:将处理后的数据高性能安全的写入磁盘,或从磁盘中正确的读取......
  • MySQL的页与行格式
    什么是MySQL的页?页是指存储引擎使用的最小的数据存储单位。当MySQL执行读取或写入操作时,是以页为基本单位来进行操作的。即使读写一条数据,MySQL也会按页操作。MySQL的存储引擎会将数据分成多个页,并根据需要将这些页加载到内存中进行处理。通过使用页来组织数据,MySQL能够......
  • MYSQL学习笔记1: DDL的库表操作
    SQL语句分类DDL数据定义语言,用来定义数据库对象(数据库,表,字段)DML数据操作语言,用来对数据库中表的数据进行增删改DQL数据库查询语言,用于查询数据库中表的记录DCL数据控制语言,用来创建数据库用户、控制数据库的访问权限DDL数据定义语言,用来定义数据库对象(数据......
  • Docker搭建Mysql集群
    一、新建主服务器示例3307dockerrun-p3307:3306--namemysql-master\-v/docker-volume/mysql-master/log:/var/log/mysql\-v/docker-volume/mysql-master/data:/var/lib/mysql\-v/docker-volume/mysql-master/conf:/etc/mysql\-eMYSQL_ROOT_PASSWORD=root\-d......
  • MySQL-01.Linux下MySQL安装和使用
    C-01.Linux下MySQL的安装和使用前置说明,MySQL高级部分,需要前置知识,为Linux操作系统。如果没有该部分知识,这里推荐韩顺平老师的Linux操作系统的教程。韩老师Linux教程1.安装前准备1.1Linux系统及工具的准备安装并启动好两台虚拟机:CentOS7版本掌握克隆虚拟机的操作mac地......
  • MYSQL意向锁的作用
    结论:当一个事务要对表进行锁定时,首先会获取相应的意向锁。其他事务可以通过检查意向锁来判断是否有其他事务在更细粒度的级别上对表进行了锁定。这有助于避免冲突和提高并发性能在讨论此问题之前我们应当明确两个前提:Innodb存储引擎支持行锁和表锁共存行锁与表锁之间互不冲突......