mysql中bit_count和bit_or使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中bit_count和bit_or使用相关的知识,希望对你有一定的参考价值。

参考技术A 在看参考手册的时候看到个案例
3.6.8 Calculating Visits Per Day

首先要说明以下几个函数
bit_count:
就是计算二进制里有多少个1
10的二进制是1010
bit_count(10) = 2
100的二进制是1100100
bit_count(123) = 3

bit_or:
按位或,就是如果两边一个位置上存在1,那这个位置就为1
拿上面10和100举例
10 | 100 转换为二进制就是 1010|1100100
1010
1100100

1101110

1<<day:
向左位移,向左位移几位,然后用0填补
比如day=2
1<<2 = 100
day=4
1<<4 = 10000

回到主题,现在要计算出图中每天的访问量,可以看到day列中是存在重复记录的,所以要去除,一般思路应该会写出以下SQL:

这个的确可以得到正确值,但是官方参考文档里使用了更巧妙的算法

为了演示,现在将day设定为1,2,2,3好了,那就等于
bit_or(1<<1, 1<<2, 1<<2, 1<<3)
10 | 100 | 100 | 1000 => 110 | 100 | 1000 => 110 | 1000 => 1110
当110 | 100的时候,相同的值就不会发生变化,所以最后bit_count的结果就为3

插入2w条数据后,看下执行计划,第一种SQL执行两遍全表扫描

为了明确看到查询性能,我们启用profiling并关闭query cache:

需要 nosql 数据库进行按位条件查询

【中文标题】需要 nosql 数据库进行按位条件查询【英文标题】:Need nosql database for queries with bitwise condition 【发布时间】:2014-12-04 17:50:20 【问题描述】:

我目前正在使用 apache cassandra 数据库来存储信息。 但是 cassandra 不允许执行按位运算的查询。

我需要执行查询:

从 field1 = 的表中选择 count(*)和 BIT_COUNT(field2 ^ ?)

但 cassandra 不允许这样做。

您能建议一些 nosql 或嵌入式快速 sql 解决方案吗?

数据库包含超过 100 万行。

【问题讨论】:

【参考方案1】:

如果您对 Cassandra 感到满意,您可以添加 Spark 并使用 Spark SQL 执行类似的查询。 Spark 有一个开源连接器,可以使用 Cassandra 作为其分布式数据库。

还有 DataStax Enterprise,它允许您与 Hadoop/Hive 集成并获得类似的分析功能。 (DataStax Enterprise 也是一种获取 Spark 功能的简单方法。)

【讨论】:

这个 apache spark 是什么?还有数据库是哪个集群还是什么? 是的,Apache Spark 能够替代 Hadoop 的 M/R 框架,并且比 hadoop 的 M/R 更灵活、更快且开销更少。它需要像 Cassandra(或 Hadoop 的 HDFS)这样的底层分布式数据库。我不确定您的数据库/集群问题是什么,您能详细说明一下吗? 问题是spark如何处理数据,将数据加载到内存中还是如何? 还有。 spark是有自己的数据存储还是只使用底层的Cassandra? Spark 将数据加载到内存中,如果这还不够,则具有磁盘溢出机制。据我所知,Spark 没有自己的数据存储机制,而是依赖于作者提供的“弹性分布式数据集”(RDD)。每个 RDD 都可能依赖于不同的底层技术(cassandra、hdfs 等)。它只会将您明确告诉它写回的内容写回 Cassandra。

以上是关于mysql中bit_count和bit_or使用的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL SQL语句技巧初探

为啥 MySQL BIT_OR() 返回的值与 PHP 位运算不同

JPQL 中等效的 UTL_RAW.BIT_OR

MySQL函数的聚合函数

MySQL 8.0新特性 -- bit-wise操作

如何才能使图形化管理MySQL更轻松(一)