首页 > 数据库 >mysql数据库为什么不建议select * from操作

mysql数据库为什么不建议select * from操作

时间:2022-12-09 17:03:47浏览次数:54  
标签:compact 存储 20 字节 数据库 mysql 格式 数据 select

为什么select * from不是好的选择?

在这里只是针对innodb数据库引擎来说明。我每次看到select * from tableName时,我都觉得有没有必要?取出全部的列会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。

这里重点说一点,当一个表中有varchar或者varbinary、各种text类型、各种BLOB类型时,在数据库存储这些大容量的字符串内容,BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。MySQL把每个BLOB和TEXT值当作一个独立的对象处理。存储引擎 在存储时通常会做特殊处理。当BLOB和TEXT值太大时,InnoDB会使用专门前“外部”存储区域来进行存储,此时每个值在行内需要存储一个指针,然后在外部 存储区域存储实际的值。

这样导致select * from 的时候包含这些大字段值,产生查找到外部存储器地址,又进行一次或者多次的外部I/O查询,速度会非常的慢。

下面细讲一下mysql存储原理:

innodb中磁盘和内存交互的基本单位都是页,也就是说Innodb是以页为基本单位来管理存储空间的,我们记录都会被分配到某个页中存储。而一个页大小是16KB,也就是16384字节。在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,或者一次最少把内存中的16KB内容刷新到磁盘中。当一个列的实际数据就需要超过16KB时,很显然一个页存不下一条记录。问题怎么解决呢?

在compact行格式和dynamic行格式中,对于占用存储空间非常多的列,对于compact格式,存储该列的一部分数据,然后在真实数据处用20字节存储指向这些页的地址(需要到外部存储页其余数据)。而dynamic格式,在记录真实数据时,该列只会用20字节空间,而这20字节的空间不存储数据,因为数据都分散存储在其他几行中了。这20字节的空间存储的是分散行的地址和占用的字节数。分散行记录是单链表连接的结构。注意compact和dynamic有区别

mysql数据库为什么不建议select * from操作_数据

                                 compact的行格式存储方式

从上图看到,compact行格式,如果某一列的数据非常多,则在本记录的真实数据处只会存储该列前768字节的数据以及只想其他页面的地址(20字节),除了768字节之外的数据的页面称为溢出页。如下图

mysql数据库为什么不建议select * from操作_字符串_02




标签:compact,存储,20,字节,数据库,mysql,格式,数据,select
From: https://blog.51cto.com/wyf1226/5926278

相关文章

  • 静态配置、request对象方法,pycharm连接mysql,django连接mysql,django ORM
    目录静态文件配置静态文件相关配置form表单request表单pycharm连接数据库django连接数据库ORM简介ORM基本操作ORM基本语句静态文件配置1.编写一个用户登录页面2.静态文......
  • 部门mysql操作
     usetest_db;--删除表droptableifexistst1_profit;droptableifexistst1_salgrade;droptableifexistst1_emp;droptableifexistst1_dept;--......
  • re_mysql_20221209
    --navicatSHOWTABLES;DESCtb_user;SHOWCREATETABLEtb_user;/*CREATETABLE`tb_user`(`id`int(11)DEFAULTNULLCOMMENT'编号',`name`varchar(50......
  • MYSQL 1 DAY
    目录MySQL1、sql、DB、DBMS分别是什么,他们之间的关系?2、什么是表?3、学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢?4、导入数据(后期大家练......
  • 修改mysql的root密码
    方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password('新密码');例子:mysql>setpasswordforroot@localhost=passwo......
  • 数据库,部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别
    要讲清楚范式,就先讲讲几个名词的含义吧:部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。举个例子:学生基本信息表R中(学号,......
  • 创建数据库表、数据表的类型
    创建数据库表、数据表的类型创建数据库表--目标:创建一个school数据库--创建学生表(列,字段)使用SQL创建--学号int,登陆密码varchar(20),姓名,性别varchar(2),出生日......
  • 最小支持度、最小置信度、全国三级数据库考试
    首先解释一下什么是置信度、什么是支持度置信度=在事务中已经包含X的情况下包含Y的百分比;支持度=事务中同时包含X、Y的百分比;下面看一个三级数据库题库的真题吧1)以下是某商......
  • mysql事务
    事务事务是一个最小的执行单元。通常一个事务对应一个完整的业务,多个操作同时进行,要么同时成功,要么同时失败,就是事务。一个完整的业务需要批量的DML(数据操纵语言,指数据库......
  • 框架第二课---静态文件配置,request对象方法,pycharm连接MySQL,django连接MySQL,django模
    昨日内容回顾手写web框架1.socket服务端2.http协议3.网址后缀wsgiref模块1.封装socket代码2.处理http相关数据代码封装优化1.函数2.对应关系3.文件、目......