大数据之Phoenix

Current release 4.16.0 can run on Apache HBase 1.3, 1.4, 1.5 and 1.6. Current release 5.1.1 can run on Apache HBase 2.1, 2.2, 2.3 and 2.4 CDH HBase 5.11, 5.12, 5.13 and 5.14 is supported by 4.14.0.
Apache HBase 2.0 is supported by 5.0.0.

1 Phoenix简介

1.1 概述

Apache Phoenix通过完美的结合以下二方面,在Hadoop中为低延迟应用程序启用OLTP和运营分析

  • 具有完整ACID事务功能的标准SQL和JDBC API的功能。
  • 通过利用HBase作为其后备存储,从NoSQL世界获得最新绑定的读取模式功能的灵活性。

Apache Phoenix已与其他Hadoop产品(例如Spark,Hive,Pig,Flume和Map Reduce)完全集成。

Phoenix 构建在 HBase 之上的开源 SQL 层. 能够让我们使用标准的 JDBC API 去建表, 插入数据和查询 HBase 中的数据, 从而可以避免使用 HBase 的客户端 API。在我们的应用和 HBase 之间添加了 Phoenix, 并不会降低性能, 而且我们也少写了很多代码.

1.2 特点

  1. 将 SQl 查询编译为 HBase 扫描
  2. 确定扫描 Rowkey 的最佳开始和结束位置
  3. 扫描并行执行
  4. 将 where 子句推送到服务器端的过滤器
  5. 通过协处理器进行聚合操作
  6. 完美支持 HBase 二级索引创建
  7. DML命令以及通过DDL命令创建和操作表和版本化增量更改。
  8. 容易集成:如Spark,Hive,Pig,Flume和Map Reduce。

1.3 架构

phoenix

1.4 Phoenix 数据存储

Phoenix 将 HBase 的数据模型映射到关系型世界
在这里插入图片描述

2 Phoenix快速入门

hadoop版本:3.2.1
HBase版本:2.3.1
Phoenix版本:5.1.0(亲测5.1.1启动有问题,导致hbase RIT并宕机)

2.1 安装

1.下载及解压

#下载
[root@hbase-67 data1]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/phoenix-5.1.0/phoenix-hbase-2.3-5.1.0-bin.tar.gz
#解压
[root@hbase-67 data1]# tar -zxvf phoenix-hbase-2.3-5.1.0-bin.tar.gz
#重命名
[root@hbase-67 data1]# mv phoenix-hbase-2.3-5.1.0-bin phoenix-hbase-2.3-5.1.0

2.将Phoenix的phoenix-server-hbase-*.jar包复制到HBase lib目录下,并分发到其它HBase节点

[root@hbase-67 phoenix-hbase-2.3-5.1.0]# cp phoenix-server-hbase-2.3-5.1.0.jar /data1/hbase-2.3.1/lib/

3.配置Phoenix环境

[root@hbase-67 phoenix-hbase-2.3-5.1.0]# vim /etc/profile
export PHOENIX_HOME=/data1/phoenix-hbase-2.3-5.1.0
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
[root@hbase-67 phoenix-hbase-2.3-5.1.0]# source /etc/profile

4.启动Phoenix

[root@hbase-67 phoenix-hbase-2.3-5.1.0]# bin/sqlline.py hbase-67,hbase-70,hbase-84:2181
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect -p driver org.apache.phoenix.jdbc.PhoenixDriver -p user "none" -p password "none" "jdbc:phoenix:hbase-67,hbase-70,hbase-84:2181"
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data1/phoenix-hbase-2.3-5.1.0/phoenix-client-hbase-2.3-5.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data1/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Connecting to jdbc:phoenix:hbase-67,hbase-70,hbase-84:2181
21/04/07 20:29:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connected to: Phoenix (version 5.1)
Driver: PhoenixEmbeddedDriver (version 5.1)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
sqlline version 1.9.0
0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21>

2.2 表操作

语法参考:http://phoenix.apache.org/language/index.html

2.2.1 !table!tables显示所有表(注意不要加;)

以下都是Phoenix创建的系统表,维护Phoenix和HBase之间的映射关系、函数等元数据。

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> !table
+-----------+-------------+------------+--------------+---------+-----------+-------------+
| TABLE_CAT | TABLE_SCHEM | TABLE_NAME |  TABLE_TYPE  | REMARKS | TYPE_NAME | SELF_REFERE |
+-----------+-------------+------------+--------------+---------+-----------+-------------+
|           | SYSTEM      | CATALOG    | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | CHILD_LINK | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | FUNCTION   | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | LOG        | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | MUTEX      | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | SEQUENCE   | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | STATS      | SYSTEM TABLE |         |           |             |
|           | SYSTEM      | TASK       | SYSTEM TABLE |         |           |             |
+-----------+-------------+------------+--------------+---------+-----------+-------------+

2.2.2 create创建表(标准SQL)

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> CREATE TABLE IF NOT EXISTS us_population (
. . . . . . . . . . . . . . . . . . . . . . )>       state CHAR(2) NOT NULL,
. . . . . . . . . . . . . . . . . . . . . . )>       city VARCHAR NOT NULL,
. . . . . . . . . . . . . . . . . . . . . . )>       population BIGINT
. . . . . . . . . . . . . . . . . . . . . . )>       CONSTRAINT my_pk PRIMARY KEY (state, city));

说明:

  1. char类型必须添加长度限制。
  2. varchar 可以不用长度限制。
  3. 主键映射到 HBase 中会成为 Rowkey。 如果有多个主键(联合主键), 会把多个主键的值拼成 rowkey。
  4. 在 Phoenix 中, 默认会把表名,字段名等自动转换成大写。如果要使用小写, 需要把他们用双引号括起来。

2.2.3 upsert插入记录(update和insert的变体)

由于在HBase中insert和update实际上都是新增一条记录,通过时间戳控制版本,因此合并为upsert常量值注意使用单引号。(否则会出现Error: ERROR 204 (22008): Values in UPSERT must evaluate to a constant. (state=22008,code=204)

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> upsert into us_population values('NY','NewYork',8143197);
0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> upsert into us_population values('CA','Los Angeles',3844829);
0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> upsert into us_population values('IL','Chicago',2842518);

2.2.4 select查询记录(标准SQL)

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> select * from US_POPULATION;
+-------+-------------+------------+
| STATE |    CITY     | POPULATION |
+-------+-------------+------------+
| CA    | Los Angeles | 3844829    |
| IL    | Chicago     | 2842518    |
| NY    | NewYork     | 8143197    |
+-------+-------------+------------+

HBash中存入的原始数据,Phoenix会在每行额外增加了列\x00\x00\x00\x00,值为x

hbase(main):002:0> scan 'US_POPULATION'
ROW                                       COLUMN+CELL                                                                                                             
 CALos Angeles                            column=0:\x00\x00\x00\x00, timestamp=2021-04-07T12:44:06.461Z, value=x                                                  
 CALos Angeles                            column=0:\x80\x0B, timestamp=2021-04-07T12:44:06.461Z, value=\x80\x00\x00\x00\x00:\xAA\xDD                              
 ILChicago                                column=0:\x00\x00\x00\x00, timestamp=2021-04-07T12:44:11.024Z, value=x                                                  
 ILChicago                                column=0:\x80\x0B, timestamp=2021-04-07T12:44:11.024Z, value=\x80\x00\x00\x00\x00+_\x96                                 
 NYNewYork                                column=0:\x00\x00\x00\x00, timestamp=2021-04-07T12:43:50.132Z, value=x                                                  
 NYNewYork                                column=0:\x80\x0B, timestamp=2021-04-07T12:43:50.132Z, value=\x80\x00\x00\x00\x00|A]                                    

2.2.5 delete删除记录(标准SQL)

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> delete from us_population where state='NY';

2.2.6 drop删除表

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> drop table us_population;

2.2.7 !quit退出命令行

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> !quit

2.3 Phoenix表与Hbase表之间映射

默认情况下, 直接在 HBase 中创建的表通过 Phoenix 是查询不到的。如果要在 Phoenix 中操作直接在 HBase 中创建的表,则需要在 Phoenix 中进行表的映射。映射方式有两种:

  1. 视图映射
  2. 表映射

视图映射与表映射相比:

  • 相比于表映射,视图的查询效率会低, 原因是:使用表映射时,Phoenix 会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率。
  • 使用create table创建的映射表,如果对表进行了修改,源数据也会改变,同时如果映射表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。

HBase表设计
在这里插入图片描述
启动bin/hbase shell创建student表,并添加部分数据

hbase(main):004:0> create 'student','info','school'

hbase(main):006:0> put 'student','1001','info:name','zhangsan'
hbase(main):008:0> put 'student','1001','info:age','23'                                                                     
hbase(main):009:0> put 'student','1001','school:address','shanghai'                                                                      
hbase(main):010:0> put 'student','1001','school:class','1'

此时使用Phoenix的!table是查询不到student表的。

2.3.1 视图映射

Phoenix 创建的视图是只读的, 所以只能用来查询, 无法通过视图对数据进行修改等操作。

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> create view "student"(stuId varchar primary key,"info"."name" varchar,"info"."age" INTEGER,"school"."address" varchar,"school"."class" varchar);

支持的数据类型:http://phoenix.apache.org/language/datatypes.html

问题:
Error: ERROR 201 (22000): Illegal data. Expected length of at least 104 bytes, but had 8 (state=22000,code=201)
解决:
方法一:age列由INTEGER类型改为varchar类型,暂时没想到其他方案

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> alter view "student" drop column "info"."age";
0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> alter view "student" add "info"."age" varchar;

方法二:
直接操作HBase添加的数据与操作Phoenix添加数据,对于非字符串类型存储是不一样的
参考:https://stackoverflow.com/questions/52829944/apache-phoenix-illegal-data-exception

2.3.1 表映射

使用 Phoenix创建对 HBase 的表映射,有两种方法:
1.当 HBase 中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view 改为 create table 即可。 在 HBase 中创建表:

hbase(main):018:0> create 'student1','info','school'

hbase(main):006:0> put 'student1','1001','info:name','zhangsan'
hbase(main):008:0> put 'student1','1001','info:age','23'                                                                     
hbase(main):009:0> put 'student1','1001','school:address','shanghai'                                                                      
hbase(main):010:0> put 'student1','1001','school:class','1'

在 Phoenix 中创建关联表:

0: jdbc:phoenix:hbase-67,hbase-70,hbase-84:21> create table "student1"(stuId varchar primary key,"info"."name" varchar,"info"."age" varchar,"school"."address" varchar,"school"."class" varchar) column_encoded_bytes=0;

使用column_encoded_bytes=0参数, 在 HBase 中添加的数据在 Phoenix 中也可以查询到, 否则 HBase 中添加的数据在 Phoenix 中查询不到。

2.当 HBase 中不存在表时,可以直接使用 create table 指令创建需要的表,系统将会自动在 Phoenix 和 HBase 中创建表。

3 Phoenix创建HBase二级索引

3.1 HBase协处理器

HBase的协处理接口是Coprocessor,我们如果需要自定义协处理器,一般继承BaseRegionObserver即可,HBase的协处理器定义了大量方法,可以在HBase RegionServer的各种生命周期中自定义操作。
在这里插入图片描述
自定义协处理器:

/**
 * 自定义协处理器
 * 向A表插入数据的同时,向索引表index插入数据
 * 创建表时可通过{@link ModifyableTableDescriptor#setCoprocessor}指定协处理器,并且需要将该项目package上传到${HBASE_HOME}/lib下,否则将发生NOTCLASSFOUND 异常
 */
public class FruitTableCoprocessor extends BaseRegionObserver {

    @Override
    public void postPut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability) throws IOException {
        // 1.获取Connection对象
        Connection connection = ConnectionFactory.createConnection(HBaseConfiguration.create());

        // 2. 获取索引表对象
        Table index = connection.getTable(TableName.valueOf("index"));

        // 3. 执行数据插入
        index.put(put);

        // 4. 关闭资源
        index.close();
        connection.close();
    }
}

3.2 HBase 的二级索引

我们知道 HBase 只能通过 rowkey 进行搜索, 一般把 rowkey 称作一级索引。在很长的一段时间里 HBase 就只支持一级索引。HBase 里面只有 rowkey 作为一级索引, 如果要对库里的非 rowkey 字段进行数据检索和查询, 往往要通过 MapReduce/Spark 等分布式计算框架进行,硬件资源消耗和时间延迟都会比较高。
为了 HBase 的数据查询更高效、适应更多的场景, 诸如使用非 rowkey 字段检索也能做到秒级响应,或者支持各个字段进行模糊查询和多字段组合查询等, 因此需要在 HBase 上面构建二级索引, 以满足现实中更复杂多样的业务需求。从 0.94 版本开始, HBase 开始支持二级索引。二级索引的实现原理其实就是协处理器,当我们创建索引时,HBase会动态的为表添加相应的协处理器,并且为之前的数据添加索引。

3.3 配置 HBase 支持 Phoenix 创建二级索引

需要先给HBase配置支持创建二级索引
添加如下配置到HBase的所有节点的hbase-site.xml

<!-- phoenix二级索引支持  -->
<property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

<!--<property>
    <name>hbase.region.server.rpc.scheduler.factory.class</name>
    <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>-->

<!--<property>
    <name>hbase.rpc.controllerfactory.class</name>
    <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
    <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>-->
<!-- phoenix master 配置参数 -->
<!--<property>
    <name>hbase.master.loadbalancer.class</name>
    <value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
</property>-->

3.4 phoenix创建索引

Phoenix 索引分全局索引(Global Index)和局部索引(Local Index)
Local Index 和 Global Index 区别:

  • Global Index 是默认的索引格式,创建全局索引时,会在HBase中建立一张新表,也就是说索引数据和数据表是存放在不同的表中;因此 Global Index 是一种分布式索引,可以直接利用索引定位服务器和region,速度更快,但是由于分布式的原因,数据一旦出现新增变化,分布式的索引要进行跨服务的同步操作,带来大量的通信消耗。所以在写操作频繁的字段上不适合建立Global Index 。
  • Local Index 索引数据和数据表是存放在同一张表中(其是同一个Region上),由于是数据与索引在同一服务器上,避免了在写操作时向不同RegionServer的索引表中写索引带来的额外开销,查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。

总结:
Local Index 由于是数据与索引在同一服务器上,所以要查询的数据在哪台服务器的哪个region是无法定位的,只能先找到region然后再利用索引。
Global Index 是一种分布式索引,可以直接利用索引定位服务器和region,速度更快,但是由于分布式的原因,数据一旦出现新增变化,分布式的索引要进行跨服务的同步操作,带来大量的通信消耗。所以在写操作频繁的字段上不适合建立Global index。

3.4.1 Global Index

适用于读多写少的业务场景。写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。
在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间。如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。
创建全局索引的方法:

CREATE INDEX my_index ON my_table (my_col)

3.4.2 Local Index

local Index 适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。
查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。
创建局部索引的方法(相比全局索引多了一个关键字 local):
CREATE LOCAL INDEX my_index ON my_table (my_index)
在这里插入图片描述

3.4.3 索引命令

# phoenix先建立源数据表
phoenix> create table person(id varchar primary key,name varchar,age varchar,address varchar);
phoenix> upsert into person values('1001','zhangsan','23','shanghai');

#HBase查看源数据
hbase(main):013:0> scan 'PERSON'
ROW                          COLUMN+CELL                                                                    
 1001                        column=0:\x00\x00\x00\x00, timestamp=2021-05-12T23:13:56.296, value=x          
 1001                        column=0:\x80\x0B, timestamp=2021-05-12T23:13:56.296, value=zhangsan           
 1001                        column=0:\x80\x0C, timestamp=2021-05-12T23:13:56.296, value=23                 
 1001                        column=0:\x80\x0D, timestamp=2021-05-12T23:13:56.296, value=shanghai 

1.创建全局索引
第一种:

#phoenix创建globa index
phoenix> CREATE INDEX person_idx_name ON person(name);

#HBase查看索引表数据,发现rowkey组成为PERSON表的name+\x00+rowkey
hbase(main):010:0> scan 'PERSON_IDX_NAME'
ROW                          COLUMN+CELL                                                                    
 zhangsan\x001001            column=0:\x00\x00\x00\x00, timestamp=2021-05-12T22:57:53.056, value=\x01 

#查看查询执行计划
#由于字段age和address不在索引表中,所以无法使用索引表,只能全表扫描源数据表
phoenix> explain select name,age,address from person where name='zhangsan';
+-----------------------------------------------------------------+----------------+---------------+-------+
|                              PLAN                               | EST_BYTES_READ | EST_ROWS_READ | EST_I |
+-----------------------------------------------------------------+----------------+---------------+-------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN FULL SCAN OVER PERSON | null           | null          | null  |
|     SERVER FILTER BY NAME = 'zhangsan'                          | null           | null          | null  |
+-----------------------------------------------------------------+----------------+---------------+-------+

#由于只查询了索引字段,所以使用了索引表,进行RANGE SCAN
phoenix> explain select name from person where name='zhangsan'        
+----------------------------------------------------------------------------------------+-----------------+
|                                          PLAN                                          | EST_BYTES_READ  |
+----------------------------------------------------------------------------------------+-----------------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER PERSON_IDX_NAME ['zhangsan'] | null            |
|     SERVER FILTER BY FIRST KEY ONLY                                                    | null            |
+----------------------------------------------------------------------------------------+-----------------+

第二种:支持查询索引字段以外的其他字段

#phoenix创建globa index
phoenix> CREATE INDEX person_idx_name ON person(name) INCLUDE (age,address);

#HBase查看索引表数据,发现索引表中包含age和address列的数据
hbase(main):016:0> scan 'PERSON_IDX_NAME'
ROW                          COLUMN+CELL                                                                    
 zhangsan\x001001            column=0:\x00\x00\x00\x00, timestamp=2021-05-12T23:13:56.296, value=\x01       
 zhangsan\x001001            column=0:\x80\x0B, timestamp=2021-05-12T23:13:56.296, value=23                 
 zhangsan\x001001            column=0:\x80\x0C, timestamp=2021-05-12T23:13:56.296, value=shanghai

#查看查询执行计划
#由于age和address添加进了索引表,所以使用了索引表,进行RANGE SCAN
phoenix> explain select name,age,address from person where name='zhangsan';
+----------------------------------------------------------------------------------------+-----------------+
|                                          PLAN                                          | EST_BYTES_READ  |
+----------------------------------------------------------------------------------------+-----------------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER PERSON_IDX_NAME ['zhangsan'] | null            |
+----------------------------------------------------------------------------------------+-----------------+

第三种:

#phoenix创建globa index
phoenix> CREATE INDEX person_idx_name ON person(name,age) INCLUDE (address);

#HBase查看索引表数据,发现rowkey组成为PERSON表的name+\x00+age+\x00+rowkey
hbase(main):017:0> scan 'PERSON_IDX_NAME'
ROW                          COLUMN+CELL                                                                    
 zhangsan\x0023\x001001      column=0:\x00\x00\x00\x00, timestamp=2021-05-12T23:13:56.296, value=\x01       
 zhangsan\x0023\x001001      column=0:\x80\x0B, timestamp=2021-05-12T23:13:56.296, value=shanghai 

#查看查询执行计划
#address添加进了索引表,所以使用了索引表,进行RANGE SCAN
phoenix> explain select name,age,address from person where name='zhangsan';
+----------------------------------------------------------------------------------------+-----------------+
|                                          PLAN                                          | EST_BYTES_READ  |
+----------------------------------------------------------------------------------------+-----------------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER PERSON_IDX_NAME ['zhangsan'] | null            |
+----------------------------------------------------------------------------------------+-----------------+

2.创建局部索引

#与创建globa index的使用一样,只需要添加关键字LOCAL
phoenix> CREATE LOCAL INDEX person_idx_name ON person(name,age) INCLUDE (address);

#HBase查看源数据表数据,发现新增了二条索引数据,rowkey组成为\x00\x00+name+\x00+age+\x00+rowkey,并且索引数据的列族为L#0
#rowkey前缀\x00并不是固定的,当HBase分区时,它用来填充分区的最小值,以保证索引数据和原始数据在同一个region下
hbase(main):018:0> scan 'PERSON'
ROW                          COLUMN+CELL                                                                    
 \x00\x00zhangsan\x0023\x001 column=L#0:\x00\x00\x00\x00, timestamp=2021-05-12T23:13:56.296, value=x        
 001                                                                                                        
 \x00\x00zhangsan\x0023\x001 column=L#0:\x80\x0B, timestamp=2021-05-12T23:13:56.296, value=shanghai         
 001                                                                                                        
 1001                        column=0:\x00\x00\x00\x00, timestamp=2021-05-12T23:13:56.296, value=x          
 1001                        column=0:\x80\x0B, timestamp=2021-05-12T23:13:56.296, value=zhangsan           
 1001                        column=0:\x80\x0C, timestamp=2021-05-12T23:13:56.296, value=23                 
 1001                        column=0:\x80\x0D, timestamp=2021-05-12T23:13:56.296, value=shanghai           
  1. 删除索引
DROP INDEX person_idx_name ON person;
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值