首页 > 数据库 >Mysql数据查询逻辑

Mysql数据查询逻辑

时间:2023-10-30 18:12:33浏览次数:33  
标签:逻辑 name age 查询 索引 地址 Mysql 数据 主键

MySQL是一定有一个唯一非空索引的,如果有主键则是主键,没有主键则是用唯一键,唯一键也没有则会自动生成一个隐藏的字段作为主键;然后以这个字段作为聚簇索引;

所以比如表foo,它的每一行的所有列数据是连续的(至少每一列数据的“指针”值在行里是连续的,比如text这种列,在一行里可能只是存储的它的“指针”)

而行与行之间则不是连续的了,比如第一行的数据起始地址是0,结束地址是100;第二行数据的起始地址可能是150,结束地址是250;

所以我们select* from foo where name = 'aaa',如果name不是索引字段该怎么查出符合条件的行呢?【mysql可以直接将一个表的数据放到一个文件里就可以了;一个表的index也可以放单独的文件里】

就是通过聚簇索引得到所有行的起始地址,如:[0, 150, 340, 800, 1230, ...],然后再去找每一行的name字段(这个是固定的,因为它相对起始地址的偏移量对每一行都是固定的,字段类型也是固定的,因此寻址逻辑是固定的)的值要遍历所有的行找到name字段值对比一下,符合则把这行拿出来;

如果行数据量特别大的时候就会出现性能问题;

而如果我们给name加了索引,比如B+数;即是按算法排好序的name list,这样我们查这个list就能快速的查出符合条件的name列表;举个简单的例子,比如索引的字段age是数值,那么这个索引存储起来大概是这样:[(1, addr1), (1, addr2), (3, addr6), (3, addr9), (5, addr13), (8, addr18)],这里元组第一个字段值就是索引字段值,第二个字段就是对应的行地址,且是按索引字段值从小到大排好了序;

这样我们要找age=3的,我们就可以根据二分法或者其他搜索方法快速得出第三个和第四个元素是符合条件的记录,拿出addr6和addr9这两条记录;

 

总结:行式数据(MySQL等)是将一行的所有列的数据或数据的“指针”放到连续空间里;

而列式数据(如ClickHouse)则是将 一列的所有行数据/数据指针 放到连续的空间里(应该只能是指针,因为针对用户而言是“行”是很多行的,比如10W行,即在ck里则每一“行”都是有10W“列”);注意,每一列的数据都是经过排序的(网上是这么说的,待确认,因为每列都是排序的,排完序后列age和列name的第一个元素基本不太可能是插入时的同一条记录;比如select name, age from ck_bar where age = 1,age=1它可能在age列里是第一条数据,它怎么和插入时的name='ddd'关联起来?假设'ddd'在name列是第四个元素);所以执行select name from ck_bar where name = 'aaa'是会很快的;但是如果涉及多列的时候则会很慢?

 

标签:逻辑,name,age,查询,索引,地址,Mysql,数据,主键
From: https://www.cnblogs.com/silentdoer/p/17798490.html

相关文章

  • 内置控制逻辑的工业智能网关有哪些优势?
    针对工业物联网的数字化、智能化、集约化应用和发展,佰马科技推出了多型高性能边缘计算智能网关,以BMG800系列边缘智能网关为例,网关集数据智能采集、边缘处理分析、设备联动控制、协议兼容转换、5G/4G全网通、远程配置管控等强大功能于一体,同时内置设备控制逻辑,完美替代传统PLC设备......
  • 【MySQL】基础篇-约束
    1.基础知识1.1为什么需要约束?为了保证数据的完整性!1.2什么叫约束?对表中字段的限制。1.3约束的分类:角度1:约束的字段的个数单列约束vs多列约束角度2:约束的作用范围列级约束:将此约束声明在对应字段的后面表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束角度3:约束的......
  • Java 新手如何使用Spring MVC 中的查询字符串和查询参数?
    文章目录什么是查询字符串和查询参数?步骤1:步骤2:步骤3:步骤4:结论......
  • 深入理解 MySQL 中的锁和MVCC机制
    文章目录锁:数据访问的保护者1.了解锁的基本概念2.锁的使用场景3.示例:MySQL中的锁MVCC:多版本并发控制1.MVCC的工作原理2.MVCC的优点3.示例:MySQL中的MVCC如何选择合适的锁和MVCC1.确定隔离级别2.避免过度使用锁3.监控和调优结语......
  • 像素流逻辑整理
    player.htmlonload()app.jsload()start()connect()msg=websocketif(msg.type==='config'){onConfig(msg);}elseif(msg.type==='playerCount'){updateKickButton(msg.count-1);}elseif(msg.type==='answer'){on......
  • centos7:安装python3.6.8:安装uvicorn、fastapi、pymysql:指定国内的pypi镜像源
    yuminstallpython3python3-develgccmakelibaio-develpip3install-ihttp://mirrors.aliyun.com/pypi/simple--trusted-hostmirrors.aliyun.com"uvicorn[standard]"==0.16.0pymysqlfastapi 关键点:因为centos7的软件仓库中,python3的版本比较低:python3-3.6.8-1......
  • com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key
    问题:连接MySQL数据库时抛出异常信息:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:PublicKeyRetrievalisnotallowed一开始aplication.yml配置如下所示:spring:application:name:service-provider-sentinel9999datasource:driver-cl......
  • MySQL系列:binlog日志详解(参数、操作、GTID、优化、故障演练)
    目录简介作用系统参数--log_bin--server_id--binlog_format--sync-binlog(双一标准)--gtid-mode(gtid)--enforce-gtid-consistency(gtid)--expire-logs-day(优化参数)--binlog_cache_size(优化参数)--max_binlog_cache_size(优化参数)--max_binlog_size(优化参数)sql_log_bin日志操作开启日......
  • java程序通过ssl连接mysql(windows环境)
    环境:OS:windows2012(mysql服务器)mysql:5.7.29jdk:1.8 说明:mysql5.7版本安装会自动生成如下的证书文件(可以用不自己再生成ca文件):ca.pemclient-cert.pemclient-key.pem同时mysql是默认开启了ssl了的keytool只使用到ca.pem文件,但是navicate工具这三个文件都会用到. 1.......
  • MySQL8.0新特性之:不可见列
    概念描述  从MySQL8.0.23版本开始,MySQL支持不可见列(invisiblecolumns),在之前版本中MySQL对所有列都是可见的,所谓不可见列就是指在正常默认查询中不会显示出来,用select*from语句是无法查询出不可见属性的列的。使用场景  1. 隐藏字段:刻意隐藏不想展示的字段,比如备注,敏感值,关......