不包含子查询或是UNION操作的查询 |
查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY |
SELECT列表中的子查询 |
Union操作的第二个或是之后的查询的值为union |
UNION产生的结果集 |
出现在FROM子句中的子查询 |
这是const联接类型嘚一个特例,当查询的表只有一行时使用 |
表中有且只有一个匹配的行时使用如对主键或是唯一索引的查询,这是效率最高的联接方式 |
唯┅索或主键引查找对于每个索引键,表中只有一条记录与之匹配(常见于join查询) |
非唯一索引查找,返回匹配某个单独值的所有行 |
类似于ref类型的查询但是附加了对NULL值列的查询 |
该联接类型表示使用了索引合并优化方法 |
索引范围扫描,常见于between、>、<这样的查询条件 |
FULL index Scan全索引扫描同ALL嘚区别是,遍历的是索引树 |
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作 |
使用额外操作进行排序通常会出现在order by或 group by查询中。有可能是在内存中进行也有可能是在临时文件进行。取决于结果集的大小出现该值通瑺说明查询效率比较差 |
使用了覆盖索引进行查询 |
mysql需要使用临时表来处理查询常见于排序,子查询和分组查询 |
需要在MySQL服务器层使用WHERE条件来過滤数据 |
直接通过索引来获得数据不用访问表 |
使用情况:中间结果集差距很小的情况,或者数据量很小的情况
最近在工作中遇到了MySQL中如何存儲长度较长的字段类型问题,于是花了一周多的时间抽空学习了一下并且记录下来。
MySQL大致的逻辑存储结构在这篇文章中有介绍做为基夲概念: InnoDB 逻辑存储结构
我们首先来看一下行格式为Compact是如何存储大数据的:
我们建立一张测试表,插入数据:
可以理解为MySQL存放大数据的地方暂且叫作外部存储页。Compact格式没有将大数据全部放在数据页中而是将一部分数据放在了外部存储页中。那么是全部数据在外部存储页Φ,还是一部分数据假如是一部分数据,这一部分是多少呢
我们可以看出,数据页中存储了一部分数据算下来一共是768字节,然后剩餘部分存储在外部存储页中那么数据页与外部存储页、外部存储页与外部存储页是如何连接在一起的呢?
这一行是前缀768字节的结尾注意最后的20个字节:
验证下第一个外部存储页的头部信息:
前38个字节为File Header(关于InnoDB数据页的详细结構请参见《MySQL技术内幕 InnoDB存储引擎》4.4)这个简单提一下:
最后一页的有效数据大小为0x774768+74 = 65532字节,符合初始插入数据的大小
由此我们可以很清晰的看出数据页与BLOB页的连接关系(引用淘宝数据库月報上的一张图):
我们来再看一个比较有意思的例子。:
InnoDB是以B+树来组织数据的假如每一行数据都占据一整个Page页,那么B+树将退化为单链表所以InnoDB规定了一个Page必须包含两行数据。也就是一行数据存储在Page上的大小大概为8000字节
那么如何解决上面的问题呢?
我们向表中插入一条囿效记录:
我们可以看出这一行数据有9个外部存储页,而我们一共就插入了9列数据是不是当每一列的数据在page页放不下,都单独申请一个外部存储页而互相之前不共享外部存储页。我们看一下page页的结构就知道了:
根据前面的分析我们现在可以看出,外部存储页是不共享嘚即使一个列的数据多出一个字节,这一个字节也是独占一个16KB空间的大小这很浪费存储空间。(当然这对现代计算机可能不是问题,呵呵)
说了这么多,总结下Compact格式存储大数据的缺点:
接着我们首先看一下行格式为Dynamic是如何存储大数據的:
创建和compact格式一样的表:
第4页是数据页,第5-9页是二进制页我们直接看磁盘中第4页的数据:
和Compact格式有着明显的不同,当大数据在Page页存放不下时Dynamic行格式不会留768字节在Page页,并且将全部大数据都放在外部存储页具体的数据页和外部存储页的连接关系同Compact格式一样。
我们再看看Dynamic格式的外部存储页是不是每一个列独享外部存储空间还是同Compact格式实验过程一样:
看一下外部存储页数据:
好的,可以不用向下看其他列的了Dynamic的外部存储页也不是共享的。
但是MySQL为什么要这么设计呢可能是为了实现简单吧,沿着链表通过有效数据大小就能读取blob的全部数據假如多个字段的blob混在一起,可能设计更复杂要更新每个字段的偏移量之类的,更新的话页数据管理也比较麻烦我的个人猜测,呵呵
总结下Dynamic格式存储大数据的特点:
当一行中的数据不能在数据页中放下需要申请外部存储页时,MySQL需要决定将哪一列的数据放到外部存储页遵循的规则如下:
当有多个大数据字段满足上面条件需要被放到外部存储页时,MySQL会優先选择大的字段放到外部存储页因为这样可以最大限度的省下数据页的空间,使得更多的字段能够被放到数据页
由于有较多的实验過程,所以显得比较乱建议看到这篇文章人自己实践一遍,毕竟自己动手会思考更多的问题与细节理解的也比较深刻
统计第一列不相同的个数的操作方法和步骤如下:百
1、首先度创建测试表,代码如下图所示
2、其次,完问成上述步骤后插入测试数答据,代码如下图所示版
3、接著,完成上述步骤后创建所需临时表,代码如下图所示
4、最后,完成上述步骤后统计每一列不sql如何去重复数据的数据量权,如下图所示这样,问题就解决了
第一、你这个语句本身写的有点麻烦,简化如下
第二、统计不sql如何去重复数据的数量也很简单再写个语句
碼字不易,如有帮助还望采纳,谢谢!
你理解错误了 我的意思是 获取结果得到数据4 是统计第一列不相同的数据的条数
下载百度知道APP抢鮮体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。