iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Innodb中怎么查询存储引擎查
  • 373
分享到

Innodb中怎么查询存储引擎查

2024-04-02 19:04:59 373人浏览 八月长安
摘要

本篇文章给大家分享的是有关Innodb中怎么查询存储引擎查,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。源码分析查询于存储引擎的实现密切相关,

本篇文章给大家分享的是有关Innodb中怎么查询存储引擎查,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。


源码分析
查询于存储引擎的实现密切相关,因此,以下内容主要针对Innodb存储引擎的查询处理进行深入研究。对于查询输出的入口点,本文从do_select()(sql\sql_select.cc)函数开始。该函数主要用于查询匹配的结果,并将查询结果通过Socket传输,或者写到数据表中。
首先看一下调用逻辑,如下所示:

do_select(): 查询入口函数。
| sub_select(): 查询部分join的记录。循环调用ha_innobase::rnd_next()和evaluate_join_record()获取并处理该部分的每条记录。(sql\sql_select.cc:11705)
| | evaluate_join_record(): 处理一条查询记录。(sql\sql_select.cc:11758)
| | rr_sequential():调用ha_innobase::rnd_next()读取下一条记录。(sql\records.cc:452)
| | | ha_innobase::rnd_next(): 读取下一条记录。(storage\innobase\handler\ha_innodb.cc:6141)
| | | | ha_innobase::general_fetch(): 从给定的索引位置获取下一条或上一条记录。(storage\innobase\handler\ha_innodb.cc:5948)
| | | | | row_search_for_Mysql(): 从数据库中查询一条记录。以下分为6个阶段分别处理各个部分。(storage\innobase\row\row0sel.c:3369)
| | | | | | 第一阶段:释放自适应hash索引的
| | | | | | | rw_lock_get_writer()函数用于获取读写锁。如果获取失败,释放目前的读写锁。(storage\innobase\include\sync0rw.ic:122)
| | | | | | 第二阶段:从预读的cache中获取记录。
| | | | | | | row_sel_pop_cached_row_for_mysql():函数用于从cache中读取一行记录,(storage\innobase\row\row0sel.c:3167)
| | | | | | | | row_sel_copy_cached_field_for_mysql(): 函数读取每个字段。(storage\innobase\row\row0sel.c:3134)
| | | | | | 第三阶段:使用自适应hash索引快速查找。
| | | | | | | row_sel_try_search_shortcut_for_mysql()函数使用hash索引获取聚集索引的记录。(storage\innobase\row\row0sel.c:3293)
| | | | | | | | row_sel_store_mysql_rec()函数将获取的innobase格式的行记录转化为mysql格式。(storage\innobase\row\row0sel.c:2692)
| | | | | | | | | row_sel_field_store_in_mysql_fORMat()函数将innobase格式的行记录中的每个字段转化为mysql格式。(storage\innobase\row\row0sel.c:2535)
| | | | | | 第四阶段:打开并恢复索引的游标位置。
| | | | | | | sel_restore_position_for_mysql(): 恢复索引的游标位置。(storage\innobase\row\row0sel.c:3070)
| | | | | | | | btr_pcur_restore_position_func(): 恢复一个持久化游标的位置。(storage\innobase\btr\btr0pcur.c:208)
| | | | | | | | | btr_cur_get_index(): 获取索引。(storage\innobase\include\btr0pcur.ic:51)
| | | | | | | | | buf_page_optimistic_get():
| | | | | | | | | btr_pcur_get_rec(): 获取持久化游标的记录。(storage\innobase\include\btr0pcur.ic:104)
| | | | | | | | | | btr_cur_get_rec (): 获取当前游标位置的记录。(storage\innobase\include\btr0pcur.ic:104)
| | | | | | | | | rec_get_offsets_func(): 获取记录中每个字段的偏移。(storage\innobase\rem\rem0rec.c:524)
| | | | | | | | btr_pcur_move_to_next(): 移动持久化游标到下一条记录。(storage\innobase\include\btr0pcur.ic:342)
| | | | | | 第五阶段:查找匹配的记录。
| | | | | | | page_rec_is_infimum(): 查看当前记录是否是该页的infinum记录。infinum记录表示比任何键值都小的记录。(storage\innobase\include\page0page.ic:415)
| | | | | | | page_rec_is_supermum(): 查看当前记录是否是该页的supermum记录。supermum记录表示比任何键值都大的记录。(storage\innobase\include\page0page.ic:403)
| | | | | | | rec_get_next_offs(): 获取相同页中下一条记录的偏移量。(storage\innobase\include\rem0rec.ic:325)
| | | | | | | rec_get_offsets_func(): 获取记录中每个字段的偏移。(storage\innobase\rem\rem0rec.c:524)
| | | | | | | rec_offs_validate():验证记录的偏移量。(storage\innobase\rem\rem0rec.c:954)
| | | | | | | row_sel_store_mysql_rec()函数将获取的innobase格式的行记录转化为mysql格式。(storage\innobase\row\row0sel.c:2692)
| | | | | | | | row_sel_field_store_in_mysql_format()函数将innobase格式的行记录中的每个字段转化为mysql格式。(storage\innobase\row\row0sel.c:2535)
| | | | | | | | btr_pcur_store_position(): 存储游标的位置。(storage\innobase\btr\btr0pcur.c:89)
| | | | | | | | | btr_pcur_get_block(): 获取持久化游标的缓冲块。(storage\innobase\include\btr0pcur.ic:90)
| | | | | | | | | btr_pcur_get_page_cur(): 获取持久化游标的页的游标。(storage\innobase\include\btr0pcur.ic:64)
| | | | | | | | | page_cur_get_rec(): 获取游标位置的记录。(storage\innobase\include\page0cur.ic:76)
| | | | | | | | | dict_index_copy_rec_order_prefix(): 拷贝记录。(storage\innobase\dict\dict0dict.c:4185)
| | | | | | | | | | rec_copy_prefix_to_buf(): 拷贝记录的字段到缓存buffer中。(storage\innobase\rem\rem0rec.c:1383)
| | | | | | | | | | dict_index_get_nth_field(): 获取第n个字段的起始地址。(storage\innobase\include\dict0dict.ic:620)
| | | | | | | | | | dict_field_get_col(): 获取第n个字段的值。(storage\innobase\include\dict0dict.ic:663)
| | | | | | 第六阶段:移动游标到下一个索引记录。
| | | | | | | btr_pcur_move_to_next(): 移动持久化游标到下一条记录。(storage\innobase\include\btr0pcur.ic:342)
| | | | | | | mtr_commit(): 提交事务。(storage\innobase\mtr\mtr0mtr.c:247)

 
       从以上查询逻辑,可以清晰的看出,MySQL的查询时如何进行的。概言之,如果可以从自适应hash索引(在内存中)中得到结果,获取结果从innobase格式转化为mysql格式并输出;否则,根据索引的游标位置,获取当前页中的记录,并拷贝当前记录到内存,同样将结果转化为mysql格式输出。
       从以上内容中,很难看出输出结果有什么规律。实际上,输出的结果是有一定规律的,这种规律与innodb存储引擎的设计和存储密切相关。
innodb存储引擎的存储是按照B+索引将主键作为键值进行聚集存储的,如果不指定主键,系统会隐藏建立一个主键。innodb存储引擎中所有的叶子节点为数据记录,并且数据记录逻辑上可以顺序访问。并且innodb存储引擎的数据存储和获取是按照页来进行的。因此,在查询时,会将整个页的数据加载到内存中,innodb存储引擎的默认页大小为16K。
实验测试
通过以上分析,不难理解,在查询时,简单查询的输出结果是一般按照B+索引的存储顺序排列的。为了进一步的验证,进行一下两个实验
实验1
以简单的带有主键的数据表student,表定义如下表所示。测试语句以简单的select * from student;为例,进行测试。
 

CREATE TABLE `student` (
  `std_id` int(11) NOT NULL,
  `std_name` varchar(20) NOT NULL DEFAULT '""',
  `std_spec` varchar(20) NOT NULL DEFAULT '""',
  `std_***` tinyint(4) NOT NULL DEFAULT '0',
  `std_age` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`std_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 
测试结果如下所示:
 

mysql> select * from student;
+------------+----------+-------------+---------+---------+
| std_id     | std_name | std_spec    | std_*** | std_age |
+------------+----------+-------------+---------+---------+
| 2012072301 | aaa      | computer    |       0 |      20 |
| 2012072303 | ccc      | computer    |       1 |      21 |
| 2012072304 | DDD      | computer    |       0 |      20 |
| 2012072305 | eee      | information |       0 |      22 |
| 2012072306 | fff      | computer    |       1 |      20 |
| 2012072307 | ggg      | computer    |       0 |      20 |
| 2012072308 | hhh      | computer    |       0 |      21 |
| 2012072309 | iii      | automatic   |       0 |      20 |
| 2012072310 | abc      | computer    |       1 |      20 |
| 2012072311 | kkk      | computer    |       0 |      18 |
| 2012072312 | lll      | computer    |       0 |      20 |
| 2012072313 | mmm      | computer    |       0 |      20 |
| 2012072314 | nnn      | computer    |       1 |      20 |
| 2012072315 | ooo      | information |       0 |      20 |
| 2012072316 | ppp      | computer    |       0 |      19 |
| 2012072317 | qqq      | computer    |       1 |      20 |
| 2012072318 | rrr      | information |       0 |      20 |
| 2012072319 | sss      | computer    |       1 |      20 |
| 2012072320 | ttt      | computer    |       0 |      20 |
| 2012072321 | uuu      | automatic   |       0 |      23 |
| 2012072322 | vvv      | computer    |       0 |      20 |
| 2012072323 | www      | computer    |       1 |      20 |
| 2012072324 | xxx      | computer    |       0 |      25 |
| 2012072325 | yyy      | automatic   |       0 |      20 |
| 2012072326 | zzz      | computer    |       1 |      20 |
| 2012080811 | bbb      | information |       0 |      20 |
+------------+----------+-------------+---------+---------+

 
实验2
       同样以student表为例,将主键为2012080811的记录更新操作,操作如下:
 

update student set std_id=2012072302 where std_id=2012080811;

 
       然后,在进行测试,测试结果如下所示:
 

+------------+----------+-------------+---------+---------+
| std_id     | std_name | std_spec    | std_*** | std_age |
+------------+----------+-------------+---------+---------+
| 2012072301 | aaa      | computer    |       0 |      20 |
| 2012072302 | bbb      | information |       0 |      20 |
| 2012072303 | ccc      | computer    |       1 |      21 |
| 2012072304 | ddd      | computer    |       0 |      20 |
| 2012072305 | eee      | information |       0 |      22 |
| 2012072306 | fff      | computer    |       1 |      20 |
| 2012072307 | ggg      | computer    |       0 |      20 |
| 2012072308 | hhh      | computer    |       0 |      21 |
| 2012072309 | iii      | automatic   |       0 |      20 |
| 2012072310 | abc      | computer    |       1 |      20 |
| 2012072311 | kkk      | computer    |       0 |      18 |
| 2012072312 | lll      | computer    |       0 |      20 |
| 2012072313 | mmm      | computer    |       0 |      20 |
| 2012072314 | nnn      | computer    |       1 |      20 |
| 2012072315 | ooo      | information |       0 |      20 |
| 2012072316 | ppp      | computer    |       0 |      19 |
| 2012072317 | qqq      | computer    |       1 |      20 |
| 2012072318 | rrr      | information |       0 |      20 |
| 2012072319 | sss      | computer    |       1 |      20 |
| 2012072320 | ttt      | computer    |       0 |      20 |
| 2012072321 | uuu      | automatic   |       0 |      23 |
| 2012072322 | vvv      | computer    |       0 |      20 |
| 2012072323 | www      | computer    |       1 |      20 |
| 2012072324 | xxx      | computer    |       0 |      25 |
| 2012072325 | yyy      | automatic   |       0 |      20 |
| 2012072326 | zzz      | computer    |       1 |      20 |
+------------+----------+-------------+---------+---------+

以上就是Innodb中怎么查询存储引擎查,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: Innodb中怎么查询存储引擎查

本文链接: https://www.lsjlt.com/news/58260.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Innodb中怎么查询存储引擎查
    本篇文章给大家分享的是有关Innodb中怎么查询存储引擎查,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。源码分析查询于存储引擎的实现密切相关,...
    99+
    2024-04-02
  • mysql如何查询存储引擎
    这篇“mysql如何查询存储引擎”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql如...
    99+
    2024-04-02
  • InnoDB存储引擎
    InnoDB是在MySQL存储引擎中第一个完整支持ACID事务的引擎,该引擎之前由Innobase OY公司所开发,后来该公司被Oracle收购。InnoDB是MySQL数据库中使用最广泛的存储引擎,已被许...
    99+
    2024-04-02
  • 如何查询mysql的存储引擎
    这篇文章主要讲解了“如何查询mysql的存储引擎”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何查询mysql的存储引擎”吧! ...
    99+
    2024-04-02
  • 什么是InnoDB存储引擎
    这篇文章主要介绍“什么是InnoDB存储引擎”,在日常操作中,相信很多人在什么是InnoDB存储引擎问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是InnoDB存储引擎”...
    99+
    2024-04-02
  • MySQL中InnoDB存储引擎是什么
    这篇文章给大家分享的是有关MySQL中InnoDB存储引擎是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库...
    99+
    2024-04-02
  • Linux下怎么查看MySql存储引擎
    这篇文章主要介绍Linux下怎么查看MySql存储引擎,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库...
    99+
    2023-06-27
  • innodb中怎么实现一个存储引擎锁
    本篇文章为大家展示了innodb中怎么实现一个存储引擎锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。| innodb存储引擎行锁的算法数据库对锁的使用是...
    99+
    2024-04-02
  • 如何将MySQL中的MyISAM存储引擎转换为InnoDB存储引擎?
    要将MyISAM引擎转换为InnoDB,我们可以使用ALTER命令。现在让我们借助引擎MyISAM 创建一个表。 mysql> create table MyISAMToInnoDBDemo -> ( -> id ...
    99+
    2023-10-22
  • mysql中InnoDB存储引擎指的是什么
    这篇文章主要介绍了mysql中InnoDB存储引擎指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。mysql中InnoDB存储引擎1、说明MySQL默认事务型存储引擎...
    99+
    2023-06-15
  • MySQL的存储引擎InnoDB和MyISAM
    目录1. MyISAM底层存储1.1 MyISAM底层存储(非聚集索引方式)1.2 InnoDB底层存储(聚集索引方式)2. InnoDB与MyISAM简介3. MyISAM与Inn...
    99+
    2024-04-02
  • MySQL中InnoDB存储引擎的示例分析
    这篇文章主要介绍MySQL中InnoDB存储引擎的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、存储引擎SQL 的执行计划是执行器组件调用存储引擎的接口来完成的。那我们可...
    99+
    2024-04-02
  • MySQL中Innodb存储引擎索引的示例分析
    这篇文章主要为大家展示了“MySQL中Innodb存储引擎索引的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中Innodb存储引擎索引的示例...
    99+
    2024-04-02
  • Mysql Innodb存储引擎之索引与算法
    目录一、概述二、数据结构与算法1、二分查找2、二叉查找树和平衡二叉树1)二叉查找树2)平衡二叉树三、B+树1、B+树完整定义2、关于 M 和 L的选定案例四、B+树索引1、聚集索引2...
    99+
    2024-04-02
  • MyISAM和InnoDB存储引擎的区别
    目录 前言存储引擎 区别事务外键表单的存储数据查询效率数据更新效率 如何选择 前言 MyISAM和InnoDB是使用MySQL最常用的两种存储引擎,在5.5版本之前默认采用MyISAM存储引擎,从5.5开始采用InnoD...
    99+
    2023-08-17
    数据库 mysql java
  • innodb存储引擎有哪些特点
    InnoDB存储引擎有以下特点:1. 事务支持:InnoDB支持ACID(原子性、一致性、隔离性和持久性)事务,可以保证数据的完整性...
    99+
    2023-09-15
    innodb
  • mysql跨服务查询之FEDERATED存储引擎的实现
    目录一、FEDERATED存储引擎1.1、说明:1.2、局限性1.3、跨服务的方式二、开启FEDERATED存储引擎1.1、查看存储引擎三、跨服务连接示例1.1、 目标:1.2、创建关系1.3、成功效果1.4、增删改查一...
    99+
    2023-01-09
    mysqlFEDERATED存储引擎 mysqlFEDERATED
  • innodb存储引擎备份工具Xtrabackup怎么用
    这篇文章主要介绍innodb存储引擎备份工具Xtrabackup怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 首先提一下还有一个备份工具是ibba...
    99+
    2024-04-02
  • mysql 存储引擎MYISAM 和 innodb 比较
    MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM ...
    99+
    2024-04-02
  • mysql InnoDB存储引擎的示例分析
    这篇文章主要介绍了mysql InnoDB存储引擎的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、概念InnoDB是MySQL默认的存储引擎,如果需要其不支持的特...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作