首页 > 数据库 >sql索引优化

sql索引优化

时间:2024-01-22 17:22:41浏览次数:32  
标签:name 优化 查询 索引 sql where seller tb

索引介绍

索引是帮助mysql搞笑获取数据的数据结构,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,(B+树)

这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引

B树

B-Tree,B树是一种多叉路横查找树,B树就是B-树,这个-是连字符号而不是减号。

假设我们的数据量达到了亿级别,主存存储不下,我们就只能以块的形式从磁盘读取数据,与主存的访问时间相比,磁盘的I/O操作相当耗时,儿B-树的主要目的就是减少磁盘的I/O操作,大多数平衡树的操作(增删改查)都需要O(h)次磁盘访问操作,h为树的高度,但是对于B-树而言,树的高度将不再是logn,而是一个我们可控的高度h 。

在实际应用的时候,B树的阶数都非常大,通常大于100,即使存储大量数据,B树的高度很低

B+树

Mysql默认使用的索引底层数据结构是B+树。

B+树是BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+树实现索引结构

相比于B树,B+树磁盘读写代价更低,查询效率B+树更加稳定,B+树便于扫库和区间查询

Mysql索引语法

创建索引语法

create [uninque] index 索引名 on 表名 (字段名,...)

列如给tb表的name字段建立一个索引

create index idx_emp_name on tb(name);

  • 常作为搜索条件的字段,适合做索引

查看索引语法

show index from 表名

索引类型

  • 聚集索引(聚簇索引)
  • 二级索引(非聚簇索引)

聚集索引:将数据存储与索引放到一块,索引结构的叶子节点保存了行数据

二级索引:将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键

sql检查是否命中索引

  • possible_key 当前sql可能会使用到的索引
  • key 当前sql实际命中的索引
  • key_len 索引占用的大小
  • Extra额外的优化建议

执行语句前面加上 expain

explain 语句

执行之后可以看见该语句是否命中索引情况

sql语句失效情况

构建场景

给tb_seller创建联合索引,字段顺序:name,status,address

违反最左前缀法则

如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始,并且不跳过索引中的列。

列如

exploan select * from tb_seller where status ="1" and address ='北京市'

不能跳过name直接查询后面,必须按顺序查询,不能跳跃查询

范围查询右边的列,不能使用索引

explain select * from tb_seller where name ="小米科技" and statue>'1' and address = ''北京市

当你在where中使用范围查找的时候,索引会发生失效

不要在索引列上进行运算操作,索引将会失效

select * from tb_seller where substring(name,3,2)='科技'

字符串不加单引号,也会导致索引失效

explan select * from tb_seller where name = ''科技 and status = '0'

explan select * from tb_seller where name = ''科技 and status = 0

由于status是字符串类型,而查询语句中没有使用单引号

在mysql的查询优化中,会自动的进行类型转换,造成索引失效

以%开头的like模糊查询,索引失效。

如果仅仅是尾部模糊匹配,索引不会失效,但如果是%开头的模糊查询,索引就会失效

标签:name,优化,查询,索引,sql,where,seller,tb
From: https://www.cnblogs.com/yifan0820/p/17980520

相关文章

  • mysql8.0主从不一致,重新同步从库
    背景:线上宕机,导致数据不一致,当时为了快速恢复业务,仅使用主库,现在需要恢复,因为主从数据相差比较大,所以对从库重新进行同步。1、首先重置从库的同步设置、并清除从库不一致数据1)#停止slavestopslave;#重置slave,会重置从库相关设置。resetslaveall;2)#清除已同步......
  • SQL 2016 AlwaysOn 无域AlwaysOn配置要点
    环境准备:(1)操作系统:WindowsServer2016Datacenter (2)SQLServer2016  配置SQL 2016AlwaysOn要点  1,因为没有域所以需要在”计算机属性“添加计算机的DNS后缀。如后缀是:kk1.com  2,非账户Administrator(是管理员组的新账号也不行),需在运行下列命令以管理员方式运行Po......
  • SQL Server 2012 AlwaysON 同步延迟时间
     SELECTavailability_mode_desc,role_desc,replica_server_name,last_redone_time,GETDATE()now,DATEDIFF(ms,last_redone_time,GETDATE())diffMSFROM((sys.availability_groupsASagJOINsys.......
  • 当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)
    错误提示"事务和快照同步时提示:当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)"原因:在SQL2008同步时到SQL2008/SQL2005/SQL2014时有时由于发布配置不当(复制扩展属性=False)当新增数据时同步会出现的错误:解决方法1:在发布服务器—选择发布项—属......
  • SQL Server 复制(Replication) ——事务复制搭建
    本文演示如何搭建最基本的事务复制。环境准备:虚拟机2台:服务器名分别为RepA和RepB,RepA为发布服务器,RepB为订阅服务器。均安装WindowsServer2008R2英文版(在外企工作的原因)。并确保两台服务器能互访。SQLServer:在上面的虚拟机中分别安装SQLServer2008R2x64英文企业版。演示数据......
  • 配置SQL 2012的AlwaysOn高性能组件
         AlwaysOn取数据库镜像和故障转移集群之长。AlwaysOn不再像故障转移集群那样需要共享磁盘,从而主副本和辅助副本可以更容易的部署到不同的地理位置;AlwaysOn还打破了镜像只能1对1的限制,支持最多5个可用性伙伴,使得辅助副本不仅能用于高可用性的目的,还能用于只读访问,甚至可以......
  • mdf\ldf文件导入SQLServer
    第一步右键点击目标.mdf/.ldf文件➡属性➡安全➡编辑➡(勾选)完全控制➡应用第二步:mdf/.ldf文件权限设置完成后,打开SQLServerManagementStudio连接服务器,随便找一个数据库。右键数据库➡新建查询➡输入下方代码执行并刷新数据库即可显示。EXECsp_attach_db@dbname=......
  • MySQL修改完my.ini无法启动
    背景在安装完mysql后查看my.ini文件,发现default-character-set和character-set-server的值都是空的,想着都设置成utf8,没想到改完保存后mysql的服务就无法启动了解决方法:1、修改ANSI编码在网上找了一圈,发现可能是因为我用默认的记事本修改后,编码给改成了UTF-8的,需要使用另存......
  • 深入分析若依数据权限@datascope (注解+AOP+动态sql拼接) 【循序渐进,附分析过程】
    除了我们平时都知道的路由权限(即对接口的访问权限外),在日常生产开发中,我们还应该有对数据的访问权限。在若依这个框架中,通过角色中的数据范围这个属性来对数据权限进行控制。对应实体类:深入分析一个用户肯定是有一种角色的,也肯定是隶属于一个部门的。这里咱们就以用户在......
  • 【最优化】优化中的转置卷积
    本篇使用的符号说明,在卷积优化函数求导中我们得到了结论\[\frac{\partial}{\partialK}\|A*K-B\|_F^2=2\mathcal{F}^{-1}\left[\overline{\mathcal{F}(A)}\odot\left(\mathcal{F}(A)\odot\mathcal{F}(K)-\mathcal{F}(B)\right)\right].\]现在考虑另一种形式\[\begin{aligned}......