首页 > 数据库 >数据库【整理】

数据库【整理】

时间:2023-10-27 14:23:25浏览次数:43  
标签:存储 name 记录 数据库 查询 回表 索引 整理

一、聚集索引与非聚集索引      

       

       索引就是二叉树,数据真实存储在叶子节点,非叶子节点存储的事引用。Mysql使用的事B+Tree

       聚集索引是包含所有列的物理存储连续,所以很庞大,新插入数据主要耗时在物理排序上面,所以相对较慢。非聚集索引只有当前列和主键列的数据,而且物理路径不连续,不用排序,所以插入较快。同理因为物理路径是否连续的问题,快慢也不尽相同。

        

      

 

 二、回表查询

        查询语句:select * from table where name = ‘小明’    【回表查询】

        因为name列虽然有索引,可以通过非聚集索引查询到id和name,但是因为使用了*,导致要回到聚集索引里面去查询到所有数据。这个过程叫做回表查询。           

三、部分索引和索引覆盖

       3.1、部分索引

                select id from table where name = ‘小明’ 

                其中name是非聚集索引列。

       3.2、索引覆盖

                select id,name from table where name = ‘小明’ 【覆盖查询,单列索引】

                只在索引里面就能查询,不用回表再次查询。

                select id,name,age from table where name = ‘小明’ 【用联合索引】【最左前缀原则】

四、索引下推

         4.1、基础原理                  

                

                【索引下推】:MySql 5.6 的新特性,简称ICP,Mysql默认开启。指将部分上层(服务层)负责的事情,交给下层(引擎层)去处理。

                【无ICP优化查询】:

                                              1、存储引擎读取索引记录;

                                              2、根据索引中的主键值,定位并读取完整的行记录;

                                              3、存储引擎把记录交给Server层去检测该记录是否满足WHERE条件。

                 【有ICP优化查询】:

                                               1、存储引擎读取索引记录(不是完整的行记录);

                                               2、判断where条件能否用索引中额列来追检查,条件不满足,则处理下一行索引记录;

                                               3、条件满足,使用索引中的组件去定位并读取完整的行记录(就是所谓的回表)

                                               4、存储引擎把记录交给server层,server层检测该记录是否满足where条件的其余部分。

             4.2、实践理解

                     假设查询语句如下:

           mysq> select * from tuser where name like '张 %' and age=10 and ismale=1;

根据前面说的“最左前缀原则”,该语句在搜索索引树的时候,只能匹配到名字第一个字是‘张’的记录(即记录ID3),接下来是怎么处理的呢?当然就是从ID3开始,逐个回表,到主键索引上找出相应的记录,再比对age和ismale这两个字段的值是否符合。

但是!MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表字数。
下面图1、图2分别展示这两种情况。                

             

                                                                                            (图一)    

                             

                                                                                             (图二)

 

图 1 中,在 (name,age) 索引里面我特意去掉了 age 的值,这个过程 InnoDB 并不会去看 age 的值,只是按顺序把“name 第一个字是’张’”的记录一条条取出来回表。因此,需要回表 4 次。

图 2 跟图 1 的区别是,InnoDB 在 (name,age) 索引内部就判断了 age 是否等于 10,对于不等于 10 的记录,直接判断并跳过。在我们的这个例子中,只需要对 ID4、ID5 这两条记录回表取数据判断,就只需要回表 2 次。

              4.3、使用条件

                       1、只能用于range、 ref、 eq_refref_or_null访问方法;

                       2、只能用于InnoDB和 MyISAM存储引擎及其分区表;

                       3、对InnoDB存储引擎来说,索引下推只适用于二级索引(也叫辅助索引);索引下推的目的是为了减少回表次数,也就是要减少IO操作。对于InnoDB的聚簇索引来说,数据和索引是在一起的,不存在回表这一说

                      4、引用了子查询的条件不能下推;

                      5、引用了存储函数的条件不能下推,因为存储引擎无法调用存储函数;

              4.4、切换状态

                       set optimizer_switch="index_condition_pushdown=off"

                       set optimizer_switch="index_condition_pushdown=on"

 

标签:存储,name,记录,数据库,查询,回表,索引,整理
From: https://www.cnblogs.com/xiaobaicai12138/p/17789804.html

相关文章

  • 大事务导致数据库恢复时间长​
    背景客户的一套系统从凌晨开始出现运行缓慢,重启SQLServer服务后一个主要的数据库一直处在正在恢复的状态,多次重启SQLServer服务和服务器无果后请我们协助处理。现象在SSMS中看到数据库是正在恢复的状态,而且不能被访问。分析启动SQLServer服务时数据库恢复要经过分析、重做和撤销......
  • scrapy中爬虫数据如何异步存储mysql数据库jd
    1.SQLCREATETABLE`JDAll`(`shop_id`VARCHAR(16)NOTNULL,//商品ID`url`VARCHAR(255)DEFAULTNULL,//商品url`title`VARCHAR(1024)DEFAULTNULL,//商品标题`brand`VARCHAR(255)DEFAULTNULL,//品牌`brand_url`VARCHAR(1024)DEF......
  • 数据库基础操作3
    今日内容详细python操作MySQL(重要)MySQL本身就是一款C/S架构,有服务端、有客户端,自身带了有客户端:mysql.exepython这门语言成为了MySQL的客户端(对于一个服务端来说,客户端可以有很多)"""SQL的由来"""操作步骤: 1.先链接MySQL host、port、username、password、charset......
  • 使用NvicatPremium时,Mysql数据库插入数据时,报错1064
    使用navicatPremium新版本时,插入数据,显示错误1064-YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''choose'('ChooseNo','SNo','CNo','......
  • 数据库查询
    1、连接查询内连接查询与单表查询相似,都是使⽤select语句可以把多张表放到select后边,并⽤逗号隔开还可以结合as取别名,⽅便引⽤如果要查询多个表中的字段,⽆重名的情况下,可以省略表的指定⾮等值连接迪卡尔积--内连接中的非等值链接。select*fromgra......
  • PostGIS安装及空间数据库的创建与shp数据导入
    PostGISisaspatialdatabaseextenderforPostgreSQLobject-relationaldatabase.ItaddssupportforgeographicobjectsallowinglocationqueriestoberuninSQL.PostGIS是空间数据库,是PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象、空间索引、......
  • golang 获取 mongo 数据库状态
    命令行模式navicatgolangpackagemainimport( "context" "encoding/json" "fmt" "log" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-drive......
  • MySQL建数据库排序规则选择
    MySQL建数据库排序规则选择引言在MySQL数据库中,选择适合的排序规则对于数据的存储和检索非常重要。排序规则决定了字符比较的方式,影响数据库的数据排序和查询结果。本文将介绍MySQL中常见的排序规则,并提供相应的代码示例来帮助读者理解和选择适合自己需求的排序规则。排序规则......
  • zblog数据库结构 表和字段详解
    表结构说明:表名储存信息zbp_category分类表zbp_comment评论表zbp_config插件配置表zbp_member用户表zbp_module模块表zbp_post文章表zbp_tag标签表zbp_upload附件表分类表:zbp_category表数据结构CREATETABLEzbp_category(......
  • 10月《中国数据库行业分析报告》已发布,深度剖析甲骨文大会Oracle技术新趋势
    为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》,持续传播数据技术知识、努力促进技术创新与行业生态发展,目前已更至第十七期,并发布了共计1......