influxdb數(shù)據(jù)庫常用命令及SpringBoot整合
一、influxdb一些概念
Influxdb是一個開源的分布式時序、時間和指標(biāo)數(shù)據(jù)庫,使用go語言編寫,無需外部依賴。
注意: influxdb只針對單機版開源,集群版還是要收費的。
1、時序數(shù)據(jù)庫
時間序列數(shù)據(jù)庫是按照時間順序來記錄數(shù)據(jù),比如我們想存儲服務(wù)器CPU和內(nèi)存分鐘級的使用率,即一分鐘產(chǎn)生一條數(shù)據(jù),時序數(shù)據(jù)庫就是最佳選擇。
注意:時序數(shù)據(jù)庫是不支持刪除和更新的
2、influxdb和mysql類比
3、points(類似表的一行數(shù)據(jù))數(shù)據(jù)結(jié)構(gòu)
4、measurement特性
- measurement類似mysql中的表,無需單獨創(chuàng)建,在第一次插入數(shù)據(jù)時自動創(chuàng)建,measurement中無數(shù)據(jù),表也就不存在了。
- measurement沒有update語句,無法修改measurement以及tags-key和fields-key名稱,實際中如有需要只能刪除整個measurement重新插入數(shù)據(jù)
5、Tag和Field
Tag: 相當(dāng)于mysql的索引,Group By查詢時只能用tag和time字段,數(shù)據(jù)類型只能是String
Field: 在Group By查詢中,函數(shù)操作只能用Field字段,例如sum();
Field支持數(shù)據(jù)類型有int,float,boolean類型
講白了,當(dāng)我們插入機器的cpu使用率時:主機的IP,Name等信息用Tag存,而使用率大小則用Field存。
6、Series
InfluxDB中的series是一種集合的概念,在同一個database中,相同retention policy、相同measurement、相同tag的數(shù)據(jù)屬于一個series集合,同一個series的數(shù)據(jù)在物理上按照時間順序排列在一起。
series就是不同tag列,進行排列組合。比如一個表中有兩個tag字段A和B。 A字段有有3種值,B字段有4種值,則series個數(shù) = 3*4=12個。
二、數(shù)據(jù)庫、表操作命令
1、數(shù)據(jù)庫操作
//通過cli操作influxdb,(登錄influxdb) influx -username root -password root //查看所有數(shù)據(jù)庫 show databases //進入到某個數(shù)據(jù)庫 use influxdb //查看用戶,兩列數(shù)據(jù),一列是用戶名稱,一列是是否為管理員用戶 show users //創(chuàng)建普通戶 create user "influx" with password '123456' //創(chuàng)建管理員用戶 create user "root" with password '123456' with all privileges //修改用戶密碼 set password for root= 'root' /** * 數(shù)據(jù)庫設(shè)置admin權(quán)限的兩種方式(建議使用第二種) */ GRANT ALL PRIVILEGES ON 數(shù)據(jù)庫名稱 TO 用戶名稱 GRANT ALL PRIVILEGES TO 用戶名稱 /** * 數(shù)據(jù)庫撤銷admin權(quán)限的兩種方式(建議使用第二種) */ Revoke ALL PRIVILEGES ON 數(shù)據(jù)庫名稱 FROM 用戶名稱 Revoke ALL PRIVILEGES FROM 用戶名稱 //查看所有表 show measurements //查看表的tag show tag keys from 表名稱 //查看表的field show field keys from 表名稱 //查看表的series show series from "表名稱" //查看當(dāng)前庫的series show series
2、表(插入)操作
一般情況下,經(jīng)常作為查詢條件的列,在初始時設(shè)置為tag,即索引,fields不常作為查詢條件,更甚者,在復(fù)雜查詢語法中,聚合語句group by 后面只能是time和tags。 一個measurement 是有多個tag和field的。
/** * InfluxDB中沒有顯式的新建表的語句,只能通過insert數(shù)據(jù)的方式來建立新表。 * 其中 cpu_usage 就是表名,resKey索引(tag),value=xx是記錄值(field),索引和記錄值可以有多個,后面的時間戳是我們指定的,如果不指定系統(tǒng)自動加當(dāng)前時間時間戳。 */ insert cpu_usage resKey=470b14f0-e869-43ed-a8e6-fd634258271f value=0.96516 #指定時間戳插入 insert cpu_usage resKey=470b14f0-e869-43ed-a8e6-fd634258271f value=0.96516 1688794582731 //刪除表 drop measurement cpu_usage //刪除數(shù)據(jù) //influxDB是沒有提供直接刪除數(shù)據(jù)記錄的方法,但是提供數(shù)據(jù)保存策略,主要用于指定數(shù)據(jù)保留時間,超過指定時間,就刪除這部分數(shù)據(jù)。(數(shù)據(jù)庫過期策略至少一個小時)
三、influxdb的sql操作(查詢)
//查詢基本構(gòu)成,中括號[]中間的,都是可選的部分 SELECT * [INTO_clause] FROM "表名" [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT N]
1、select
查詢注意:
- 在SELECT 子句中,必須要有至少一個field key!如果在SELECT子句中只有一個或多個tag key,那么該查詢會返回空。這是由InfluxDB底層存儲數(shù)據(jù)的方式所導(dǎo)致的結(jié)果。
- 在查詢中,發(fā)現(xiàn)插入的時間會比實際時間少8小時。那是因為InfluxDB默認以UTC時間存儲并返回時間戳,當(dāng)接收到一個時序數(shù)據(jù)記錄時,InfluxDB將時間戳從本地時區(qū)時間轉(zhuǎn)換為UTC時間并存儲,查詢時,InfluxDB返回的時間戳對應(yīng)的是UTC時間 。 在sql后面加上tz(‘Asia/Shanghai’),可以將UTC時間轉(zhuǎn)換為中國本地時間, 如果加上tz(‘Asia/Shanghai’)后報錯,安裝下go語言的安裝包即可解決。
- 如果查詢時,發(fā)現(xiàn)表里一查不出來數(shù)據(jù),可能是表數(shù)據(jù)太大導(dǎo)致,在后面加個limit 10,也可能是表明沒加上保存策略導(dǎo)致的,保存策略下面有講。
SELECT * FROM "cpu_usage" limit 10 tz('Asia/Shanghai')
4、在field上做一些基本計算
SELECT (value+400)*10 FROM "cpu_usage" limit 10 tz('Asia/Shanghai')
2、where語句
注意事項:
- 在InfluxDB的WHERE子句中,不支持使用 OR 來指定不同的time區(qū)間,否則將為空。比如:time=1688552647654 or time=1688552647666
- 支持對string, boolean, float 和 integer類型的field values進行比較,如果是string類型的field value,一定要用單引號括起來。如果不適用引號括起來,或者使用的是雙引號,將不會返回任何數(shù)據(jù),有時甚至都不報錯。
支持的操作符: = 等于 <> 不等于 != 不等于 > 大于 >= 大于等于 < 小于 <= 小于等于 // 查詢有特定field的key value為字符串的數(shù)據(jù) SELECT * FROM "cpu_usage" WHERE "resKey" = 'qqqqqq' tz('Asia/Shanghai') // 查詢有特定field的key value并且?guī)в嬎愕臄?shù)據(jù) SELECT (value+400)*10 FROM "cpu_usage" limit 10 tz('Asia/Shanghai')
- 在WHERE子句中的tag values,也要用單引號括起來。如果不用引號括起來,或者使用雙引號,則查詢不會返回任務(wù)數(shù)據(jù)。甚至不會報錯。
- 根據(jù)時間戳來過濾數(shù)據(jù)。
//查詢10天前的數(shù)據(jù) SELECT * FROM "cpu_usage" WHERE time > now() - 10d //根據(jù)指定時間過濾 SELECT * FROM "cpu_usage" WHERE time >= '2023-06-18T00:00:00Z' AND time <= '2024-08-18T12:30:00Z'
3、group by語句
注意事項:
- 有 GROUP BY的查詢,需要查詢的字段一定要經(jīng)過函數(shù)。
- 對多個 tag 和單個tag做 GROUP BY, 求字段value的平均值
SELECT MEAN("value") FROM "temperature" GROUP BY "field1", "field2"
- 根據(jù)時間戳進行 GROUP BY time(time_interval) ,查詢指定時間區(qū)間,以30分鐘間隔分組
SELECT MEAN(value) FROM "cpu_usage" WHERE time >= '2023-07-01T10:00:00Z' AND time < '2024-08-02T00:00:00Z' GROUP BY time(30m) tz('Asia/Shanghai')
- 根據(jù)時間戳進行GROUP BY time(time_interval, offset_interval),查詢指定時間區(qū)間,以30分鐘間隔分組,offset_interval 是一個持續(xù)時間。它向前或向后移動 InfluxDB 的預(yù)設(shè)時間界限,可以為正或負數(shù)。
//上面sql第一條數(shù)據(jù)是從2023-07-01 18:00:00開始的,如果加上offset_interval值為15m, 則查詢第一條數(shù)據(jù)變成了2023-07-01 17:45:00 SELECT MEAN(value) FROM "cpu_usage" WHERE time >= '2023-07-01T10:00:00Z' AND time < '2024-08-02T00:00:00Z' GROUP BY time(30m,15m) tz('Asia/Shanghai')
- fill()函數(shù)用法,它會更改不含數(shù)據(jù)的時間間隔的返回值。
//上面sql中,如果需要聚合的時間段每數(shù)據(jù),則用fill()中指定的值填充 SELECT MEAN(value) FROM "cpu_usage" WHERE time >= '2023-07-01T10:00:00Z' AND time < '2023-08-02T00:00:00Z' GROUP BY time(30m) fill(10) tz('Asia/Shanghai')
- Influxdb中Group By查詢中如果沒聚合函數(shù),查詢會返回該分組內(nèi)的所有數(shù)據(jù)。而Mysql中Group By查詢中如果沒聚合函數(shù),查詢只會返回一條數(shù)據(jù)。 如果查詢中有聚合函數(shù),Mysql和Influxdb一樣,返回該組內(nèi)的聚合數(shù),也就只有一條。
4、into語句
INTO主要作用是把一個表的數(shù)據(jù)導(dǎo)入到另外一個表中。插入到新表的字段是group by后的字段和查詢的字段取并集,如果沒Group By,就只看查詢出來的字段。
#把表cpu_usage的數(shù)據(jù)導(dǎo)入到備份表cpu_usage_bak中,新表和舊表的tag和Field不變 SELECT * into "cpu_usage_bak" FROM "cpu_usage" #該sql只會把value字段中插入到備份表cpu_usage_bak中,需要插入的字段在原變和舊表中tag和Field不變 SELECT value into "cpu_usage_bak" FROM "cpu_usage" #該sql只會把value和resKey字段中插入到備份表cpu_usage_bak中,需要插入的字段在原變和舊表中tag和Field不變 SELECT value into "cpu_usage_bak" FROM "cpu_usage" group by resKey #和上面sql一樣,只不過多個聚合函數(shù) SELECT max(value) into "cpu_usage_bak" FROM "cpu_usage" group by resKey #該sql插入新表后,字段都會變成field,如果不想變成Filed,查詢時加Group By即可 SELECT value,resKey into "cpu_usage_bak" FROM "cpu_usage" #該sql中存在子查詢,從子查詢查數(shù)來的數(shù)據(jù)插入到新表,字段都變成了Field SELECT value,resKey into "default"."cpu_usage_bak" FROM (select * from "default"."cpu_usage" group by resKey)
5、子查詢
子查詢是嵌套在另一個查詢的 FROM 子句中的查詢。使用子查詢將查詢作為條件應(yīng)用于其他查詢。子查詢提供與嵌套函數(shù)和 SQLHAVING 子句類似的功能。
#求組內(nèi)最大值的平均值 SELECT MEAN("value") FROM (SELECT MAX("value") AS value FROM "cpu_usage" GROUP BY "resKey") #求兩個字段差的平均值 SELECT MEAN("difference") FROM (SELECT "字段1" - "字段2" AS "difference" FROM "cpu_usage")
6、INTO導(dǎo)入到新表,導(dǎo)致數(shù)據(jù)丟失問題
Influxdb的內(nèi)部機制是基于時間的時序性數(shù)據(jù)庫,每一條記錄都會有一個時間標(biāo)識,如果客戶端記錄沒給這個時間,influxdb會提供。主鍵是由time + tag組成,是不可以重復(fù)的,如果重復(fù),后面的將覆蓋前面的。 相同的 measurement,tagset 和 timestamp 的數(shù)據(jù)會覆蓋。 解決方法就是提高時間精度到納秒?;蛘咴黾觮ag來標(biāo)識不同的點。
四、influxdb保留策略(RP)
什么是保留策略?
用來定義數(shù)據(jù)在InfluxDB中存放的時間,就是保留策略,過了這個時間,數(shù)據(jù)過期會自動刪除。 一個數(shù)據(jù)庫可以有多個保留策略,但每個策略必須是獨一無二的。 保留策略實際就類似于Mysql中的定時任務(wù)
//查看數(shù)據(jù)保存策略(建議使用第二種) show retention policies on "數(shù)據(jù)庫名稱" show retention policies /** * 創(chuàng)建數(shù)據(jù)保留策略 * h(小時),d(天),w(星期) */ //CREATE RETENTION POLICY "保留策略名稱" ON "數(shù)據(jù)庫名稱" DURATION "該保留策略對應(yīng)的數(shù)據(jù)過期時間" REPLICATION "復(fù)制因子,開源的InfluxDB單機環(huán)境永遠為1" SHARD DURATION "分片組的默認時長" DEFAULT //DEFAULT是默認保存策略,一個庫中只有一個默認保存策略。 create retention policy "testPolice" on myInfluxdb duration 72h replication 1 SHARD DURATION 1h default //修改保留策略 alter retention policy "保留策略名稱" on "數(shù)據(jù)庫名稱" duration 1d //刪除保留策略 drop retention policy "保留策略名稱" on "數(shù)據(jù)庫名稱"
備注:如果查詢influxdb沒數(shù)據(jù),一定要在表名加上保存策略。
五、influxdb連續(xù)查詢(CQ)
什么是連續(xù)查詢? 它會按照用戶指定的查詢規(guī)則,自動地、周期地查詢實時數(shù)據(jù)并執(zhí)行指定運算,然后將查詢結(jié)果保存在一張指定的表中。
舉個例子來理解連續(xù)查詢:現(xiàn)有CPU使用率數(shù)據(jù)分鐘級別,需要把分鐘級別的數(shù)據(jù)匯聚成小時級別的(生成的小時級別數(shù)據(jù)插入小時表中)。 我們只需要創(chuàng)建個連續(xù)查詢,influxdb會自動實時的把數(shù)據(jù)插入到小時表中。
注意:保存策略和連續(xù)查詢往往配合使用的。
用一個需求更加理解保存策略和連續(xù)查詢的用法:
1、把分鐘級別數(shù)據(jù)保存兩個小時。
2、把小時級別數(shù)據(jù)保存10周
實現(xiàn)方式:
//創(chuàng)建分鐘級別的保存策略:two_hours是策略名稱,rightcloud是庫名, CREATE RETENTION POLICY "two_hours" ON "rightcloud" DURATION 2h REPLICATION 1 //創(chuàng)建小時級別的保存策略:a_year是策略名稱,rightcloud是庫名 CREATE RETENTION POLICY "a_year" ON "rightcloud" DURATION 10w REPLICATION 1 //創(chuàng)建連續(xù)查詢:con_query連續(xù)查詢名稱 CREATE CONTINUOUS QUERY "con_query" ON "rightcloud" BEGIN SELECT mean("value") AS "value" INTO "a_year"."cpu_usage" FROM "autogen"."cpu_usage" GROUP BY time(10s) END //注意:分鐘級別數(shù)據(jù)和小時級別數(shù)據(jù)都是保存在cpu_usage表中,是通過保存策略來區(qū)分開的,在查詢表數(shù)據(jù)時,一定要加上策略名稱 select * from "a_year"."cpu_usage"; select * from "autogen"."cpu_usage";
六、SpringBoot整合influxdb
1、引入maven
server: port: 8080 spring: influx: url: http://127.0.0.1:8086 #influxdb服務(wù)器的地址 username: #用戶名 password: #密碼 database: rightcloud #指定的數(shù)據(jù)庫 retention_policy: autogen
2、application.yml
server: port: 8080spring: influx: url: //127.0.0.1:8086 #influxdb服務(wù)器的地址 username: #用戶名 password: #密碼 database: rightcloud #指定的數(shù)據(jù)庫 retention_policy: autogen
3、InfluxdbConfig配置類
import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; /** * influxdb配置文件 */ @Configuration public class InfluxdbConfig { @Value("${spring.influx.url}") private String influxDBUrl; @Value("${spring.influx.username}") private String userName; @Value("${spring.influx.password}") private String password; @Value("${spring.influx.retention_policy}") private String retention_policy; @Value("${spring.influx.database}") private String database; @Bean public InfluxDB influxdb() { InfluxDB influxDB = null; if (StringUtils.isEmpty(userName)) { influxDB = InfluxDBFactory.connect(influxDBUrl); } else { influxDB = InfluxDBFactory.connect(influxDBUrl, userName, password); } try { /** * 異步插入: * enableBatch這里第一個是point的個數(shù),第二個是時間,單位毫秒 * point的個數(shù)和時間是聯(lián)合使用的,如果滿100條或者60 * 1000毫秒 * 滿足任何一個條件就會發(fā)送一次寫的請求。 */ // influxDB.setDatabase(database).enableBatch(100, 1000 * 60, TimeUnit.MILLISECONDS); influxDB.setDatabase(database); } catch (Exception e) { e.printStackTrace(); } finally { //設(shè)置默認策略 this.retention_policy = retention_policy == null || "".equals(retention_policy) ? "autogen" : retention_policy; influxDB.setRetentionPolicy(retention_policy); } //設(shè)置日志輸出級別 influxDB.setLogLevel(InfluxDB.LogLevel.BASIC); return influxDB; } }
4、InfluxDBUtils工具類,提供增刪改查方法
import org.influxdb.InfluxDB; import org.influxdb.annotation.Column; import org.influxdb.annotation.Measurement; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; import org.influxdb.dto.Query; import org.influxdb.dto.QueryResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * */ @Component public class InfluxDBUtils { @Autowired private InfluxDB influxDB; @Value("${spring.influx.database}") private String database; /** * 插入單條數(shù)據(jù)寫法1 * * @param measurement */ public void insertOne01(String measurement) { //構(gòu)建 Point.Builder builder = Point.measurement(measurement); //可指定時間戳 builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS); //tag屬性只能存儲String類型 builder.tag("name", "zhanggang"); //設(shè)置field builder.addField("filed", "fileValue"); influxDB.write(builder.build()); } /** * 插入單條數(shù)據(jù)寫法2 * * @param measurement */ public void insertOne02(String measurement, Map<String, String> tags, Map<String, Object> fields) { //構(gòu)建 Point.Builder builder = Point.measurement(measurement); //可指定時間戳 builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS); //tag屬性只能存儲String類型 builder.tag(tags); //設(shè)置field builder.fields(fields); influxDB.write(builder.build()); } /** * 插入單條數(shù)據(jù) * influxDB開啟UDP功能, 默認端口:8089,默認數(shù)據(jù)庫:udp,沒提供代碼傳數(shù)據(jù)庫功能接口 * 使用UDP的原因 * TCP數(shù)據(jù)傳輸慢,UDP數(shù)據(jù)傳輸快。 * 網(wǎng)絡(luò)帶寬需求較小,而實時性要求高。 * InfluxDB和服務(wù)器在同機房,發(fā)生數(shù)據(jù)丟包的可能性較小,即使真的發(fā)生丟包,對整個請求流量的收集影響也較小。 * * @param measurement * @param tags * @param fields */ public void insertUDPOne03(String measurement, Map<String, String> tags, Map<String, Object> fields) { //構(gòu)建 Point.Builder builder = Point.measurement(measurement); //可指定時間戳 builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS); //tag屬性只能存儲String類型 builder.tag(tags); //設(shè)置field builder.fields(fields); int udpPort = 8089; influxDB.write(udpPort, builder.build()); } //批量插入1 public void insertBatchByRecords() { List<String> lines = new ArrayList<String>(); String measurement = "test-inset-one"; for (int i = 0; i < 2; i++) { Point.Builder builder = Point.measurement(measurement); //tag屬性只能存儲String類型 builder.tag("name", "zhanggang" + i); //設(shè)置field builder.addField("filed", "fileValue" + i); lines.add(builder.build().lineProtocol()); } influxDB.write(lines); } //批量插入2 public void insertBatchByPoints() { BatchPoints batchPoints = BatchPoints.database(database) .consistency(InfluxDB.ConsistencyLevel.ALL) .build(); String measurement = "test-inset-one"; for (int i = 0; i < 2; i++) { Point.Builder builder = Point.measurement(measurement); //tag屬性只能存儲String類型 builder.tag("name", "zhanggang" + i); //設(shè)置field builder.addField("filed", "fileValue" + i); batchPoints.point(builder.build()); } influxDB.write(batchPoints); } /** * 查詢,返回Map集合 * * @param query 完整的查詢語句 * @return */ public List<Map<String, Object>> fetchRecords(String query) { List<Map<String, Object>> results = new ArrayList<>(); QueryResult queryResult = influxDB.query(new Query(query, database)); queryResult.getResults().forEach(result -> { result.getSeries().forEach(serial -> { List<String> columns = serial.getColumns(); int fieldSize = columns.size(); serial.getValues().forEach(value -> { Map<String, Object> obj = new HashMap<String, Object>(); for (int i = 0; i < fieldSize; i++) { obj.put(columns.get(i), value.get(i)); } results.add(obj); }); }); }); return results; } /** * 批量寫入數(shù)據(jù) * * @param database 數(shù)據(jù)庫 * @param retentionPolicy 保存策略 * @param consistency 一致性 * @param records 要保存的數(shù)據(jù)(調(diào)用BatchPoints.lineProtocol()可得到一條record) */ public void batchInsert(final String database, final String retentionPolicy, final InfluxDB.ConsistencyLevel consistency, final List<String> records) { influxDB.write(database, retentionPolicy, consistency, records); } /** * 查詢 * * @param command 查詢語句 * @return */ public QueryResult query(String command) { return influxDB.query(new Query(command, database)); } /** * 創(chuàng)建數(shù)據(jù)保留策略 * 設(shè)置數(shù)據(jù)保存策略 defalut 策略名 /database 數(shù)據(jù)庫名/ 30d 數(shù)據(jù)保存時限30天/ 1 副本個數(shù)為1/ 結(jié)尾DEFAULT * 表示 設(shè)為默認的策略 */ public void createRetentionPolicy() { String command = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT", "defalut", database, "30d", 1); this.query(command); } }
5、在Controller類進行操作
@RestController public class InfluxDBController { @Autowired private InfluxDBUtils influxDBUtils; @GetMapping("/insertOne") public String insertOne() { String measurement = "test-inset-one"; influxDBUtils.insertOne01(measurement); return "success"; } @GetMapping("/query01") public List<Map<String, Object>> query01() { String sql = "SELECT * FROM \"test-inset-one\" TZ('Asia/Shanghai')"; return influxDBUtils.fetchRecords(sql); }
七、influxdb圖形化界面客戶端
InfluxDB Studio工具圖形化界面操作Influxdb
到此這篇關(guān)于influxdb數(shù)據(jù)庫常用命令及SpringBoot整合的文章就介紹到這了,更多相關(guān)influxdb數(shù)據(jù)庫常用命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于數(shù)據(jù)庫性能優(yōu)化中的表結(jié)構(gòu)優(yōu)化
這篇文章主要介紹了關(guān)于數(shù)據(jù)庫性能優(yōu)化中的表結(jié)構(gòu)優(yōu)化,合理的表結(jié)構(gòu)設(shè)計可以提高數(shù)據(jù)庫的查詢效率和性能,而不合理的表結(jié)構(gòu)設(shè)計則可能導(dǎo)致查詢效率低下、數(shù)據(jù)冗余、數(shù)據(jù)不一致等問題,需要的朋友可以參考下2023-07-07Clickhouse數(shù)據(jù)表、數(shù)據(jù)分區(qū)partition的基本操作代碼
clickhouse的分區(qū)是指將數(shù)據(jù)按照分區(qū)鍵進行劃分,每個分區(qū)可以包含多個數(shù)據(jù)塊,這篇文章主要介紹了Clickhouse數(shù)據(jù)表、數(shù)據(jù)分區(qū)partition的基本操作代碼,需要的朋友可以參考下2023-11-11CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫的方法
這篇文章主要介紹了CentOS 8.2部署CouchDB 3.3數(shù)據(jù)庫,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12