實驗十 合理定義分布列實現性能優化-分布式表關聯

實驗介紹

本實驗通過分析普通查詢過程中存在的性能瓶頸點,通過執行計劃的分析找到可能的性能優化點并加以實施,最終達到優化的效果,重點關注分布式關聯相關查詢語句的優化。

實驗目的

了解通過合理定義分布列實現分布式關聯的性能優化。

實驗步驟

步驟1 使用以下語句查詢

Explain analyze select
l_orderkey,
o_orderdate,
o_shippriority
from
customer,
orders,
lineitem
where
c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < '1995-03-15'::date and l_shipdate > '1995-03-15'::date
order by
o_orderdate limit 10;

步驟2 修改分布鍵

觀察查詢語句中,需要對 customer、order 和 lineitem 三張表進行關聯,其中關聯條件有c_custkey = o_custkey 和 l_orderkey = o_orderkey。如果只考慮本查詢的優化,在該列數據沒有顯著傾斜的情況下,優先考慮 customer.c_custkey 和 lineitem.l_orderkey 作為分布鍵,從而減少 DN 數據的重分布。

customer、lineitem 建表語句,并導入數據文件customer.csv、lineitem.csv。

Drop table if exists customer;CREATE TABLE CUSTOMER (
C_CUSTKEY INTEGER NOT NULL,
C_NAME VARCHAR(25) NOT NULL,
C_ADDRESS VARCHAR(400) NOT NULL,
C_NATIONKEY INTEGER  NOT NULL,
C_PHONE CHAR(15) NOT NULL,
C_ACCTBAL DECIMAL(15,2)	NOT NULL,
C_MKTSEGMENT CHAR(10) NOT NULL,
C_COMMENT VARCHAR(400) NOT NULL
)
DISTRIBUTE BY HASH(c_custkey);Drop table if exists lineitem;CREATE TABLE LINEITEM(
L_ORDERKEY INTEGER NOT NULL,
L_PARTKEY INTEGER NOT NULL,
L_SUPPKEY INTEGER NOT NULL,
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG CHAR(1) NOT NULL,
L_LINESTATUS CHAR(1) NOT NULL,
L_SHIPDATE DATE NOT NULL,
L_COMMITDATE DATE NOT NULL,
L_RECEIPTDATE DATE NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL)
DISTRIBUTE BY HASH(l_orderkey);COPY CUSTOMER FROM '/tmp/customer.csv' DELIMITER ',' QUOTE '"' ESCAPE '"' ENCODING 'GBK' CSV;COPY LINEITEM FROM '/tmp/lineitem_.csv' DELIMITER ',' QUOTE '"' ESCAPE '"' ENCODING 'UTF-8' CSV;

步驟3 嘗試使用 o_custkey 作為 orders 的分布鍵,并導入數據文件orders.csv。

Drop table if exists orders; CREATE TABLE orders (
o_orderkey bigint NOT NULL,
o_custkey bigint NOT NULL,
o_orderstatus character(1) NOT NULL,
o_totalprice numeric(15,2) NOT NULL,
o_orderdate date NOT NULL,
o_orderpriority character(15) NOT NULL,
o_clerk character(15) NOT NULL,
o_shippriority bigint NOT NULL,
o_comment character varying(79) NOT NULL
)WITH (orientation=row, compression=no)
DISTRIBUTE BY HASH(o_custkey);COPY ORDERS FROM '/tmp/orders.csv' DELIMITER ',' QUOTE '"' ESCAPE '"' ENCODING 'UTF-8' CSV;

執行步驟一中的查詢語句,設置參數:
set enable_fast_query_shipping = off;
set enable_stream_operator = on;?

該兩個參數為會話級,只在本次會話期間生效。

jiang=# Explain analyze 
jiang-# select
jiang-# l_orderkey, 
jiang-# o_orderdate, 
jiang-# o_shippriority
jiang-# from
jiang-# customer, orders, lineitem
jiang-# where
;jiang-# c_custkey = o_custkey
jiang-# and l_orderkey = o_orderkey
jiang-# and o_orderdate < '1995-03-15'::date and l_shipdate > '1995-03-15'::date
jiang-# order by
jiang-# o_orderdate limit 10;id |                      operation                      |      A-time       | A-rows | E-rows | Peak Memory | A-width | E-width | E-costs  
----+-----------------------------------------------------+-------------------+--------+--------+-------------+---------+---------+----------1 | ->  Limit                                           | 782.531           |     10 |     10 | 2KB         |         |      16 | 11271.182 |    ->  Streaming (type: GATHER)                     | 782.528           |     10 |     10 | 176KB       |         |      16 | 11271.353 |       ->  Limit                                     | [753.865,768.892] |     30 |     18 | [2KB,2KB]   |         |      16 | 11270.604 |          ->  Sort                                   | [753.861,768.887] |     30 |     18 | [28KB,29KB] | [32,32] |      16 | 11270.605 |             ->  Hash Join (6,7)                     | [752.256,767.242] |  25917 |     17 | [9KB,9KB]   |         |      16 | 11270.516 |                ->  Seq Scan on lineitem             | [85.445,98.007]   | 565702 | 564893 | [41KB,41KB] |         |       4 | 10763.067 |                ->  Hash                             | [594.646,597.109] | 713105 |     10 | [12MB,13MB] | [40,40] |      20 | 28.738 |                   ->  Streaming(type: REDISTRIBUTE) | [373.185,449.521] | 713105 |     10 | [69KB,69KB] |         |      20 | 28.739 |                      ->  Hash Join (10,11)          | [362.084,403.154] | 713105 |     10 | [9KB,9KB]   |         |      20 | 28.4410 |                         ->  Seq Scan on customer    | [14.668,18.917]   | 147100 |     30 | [34KB,35KB] |         |       4 | 14.1411 |                         ->  Hash                    | [199.532,206.435] | 727305 |     10 | [14MB,15MB] | [48,48] |      28 | 14.1812 |                            ->  Seq Scan on orders   | [145.599,150.525] | 727305 |     10 | [33KB,33KB] |         |      28 | 14.18
(12 rows)Predicate Information (identified by plan id)                   
----------------------------------------------------------------------------------5 --Hash Join (6,7)Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)6 --Seq Scan on lineitemFilter: (l_shipdate > '1995-03-15'::date), (LLVM Optimized, Jit Execute)Rows Removed by Filter: 4828749 --Hash Join (10,11)Hash Cond: (customer.c_custkey = orders.o_custkey)12 --Seq Scan on ordersFilter: (o_orderdate < '1995-03-15'::date)Rows Removed by Filter: 772695
(10 rows)Memory Information (identified by plan id)               
-----------------------------------------------------------------------Coordinator Query Peak Memory:Query Peak Memory: 2MBDatanode:Max Query Peak Memory: 15MBMin Query Peak Memory: 14MB4 --SortSort Method: top-N heapsort  Memory: 26kB ~ 26kBSort Method: top-N heapsort  Disk: 1024kB ~ 0kB7 --HashMax Buckets: 32768  Max Batches: 1  Max Memory Usage: 13010kBMin Buckets: 32768  Min Batches: 1  Min Memory Usage: 12984kB11 --HashMax Buckets: 32768  Max Batches: 1  Max Memory Usage: 15310kBMin Buckets: 32768  Min Batches: 1  Min Memory Usage: 14980kB
(14 rows)User Define Profiling                           
---------------------------------------------------------------------------Segment Id: 3  Track name: Datanode build connection(actual time=[0.203, 0.232], calls=[1, 1])Plan Node id: 2  Track name: coordinator get datanode connection(actual time=[0.029, 0.029], calls=[1, 1])Plan Node id: 2  Track name: Coordinator check and update node definition(actual time=[0.001, 0.001], calls=[1, 1])Plan Node id: 2  Track name: Coordinator serialize plan(actual time=[0.904, 0.904], calls=[1, 1])Plan Node id: 2  Track name: Coordinator send query id with sync(actual time=[0.220, 0.220], calls=[1, 1])Plan Node id: 2  Track name: Coordinator send begin command(actual time=[0.001, 0.001], calls=[1, 1])Plan Node id: 2  Track name: Coordinator start transaction and send query(actual time=[0.025, 0.025], calls=[1, 1])Plan Node id: 3  Track name: Datanode start up stream thread(actual time=[0.032, 0.049], calls=[1, 1])
(16 rows)====== Query Summary =====                                 
--------------------------------------------------------------------------------------------Datanode executor start time [dn_6007_6008_6009, dn_6004_6005_6006]: [7.810 ms,9.919 ms]Datanode executor run time [dn_6007_6008_6009, dn_6004_6005_6006]: [753.898 ms,768.921 ms]Datanode executor end time [dn_6007_6008_6009, dn_6001_6002_6003]: [0.082 ms,0.092 ms]Coordinator executor start time: 6.973 msCoordinator executor run time: 782.544 msCoordinator executor end time: 0.031 msPlanner runtime: 0.904 msPlan size: 6167 byteQuery Id: 72902018968525132Total runtime: 789.565 ms
(10 rows)

此時,orders 和 customer 兩表由于關聯列都在各自的分布鍵上,所以可以本地進行關聯,然后其結果集再根據和 lineitem 的關聯條件作為重分布的分布列進行重分布。

步驟4 嘗試使用 o_orderkey 作為 orders 的分布列,并導入數據文件orders.csv。

Drop table if exists orders;CREATE TABLE orders (
o_orderkey bigint NOT NULL,
o_custkey bigint NOT NULL,
o_orderstatus character(1) NOT NULL,
o_totalprice numeric(15,2) NOT NULL,
o_orderdate date NOT NULL,
o_orderpriority character(15) NOT NULL,
o_clerk character(15) NOT NULL,
o_shippriority bigint NOT NULL,
o_comment character varying(79) NOT NULL
)
WITH (orientation=row, compression=no)
DISTRIBUTE BY HASH(o_orderkey);COPY ORDERS FROM '/tmp/orders.csv' DELIMITER ',' QUOTE '"' ESCAPE '"' ENCODING 'UTF-8' CSV;

執行步驟 1 中查詢語句:

jiang=# Explain analyze 
jiang-# select
jiang-# l_orderkey, 
jiang-# o_orderdate, 
jiang-# o_shippriority
jiang-# from
jiang-# customer, orders, lineitem
jiang-# where
jiang-# c_custkey = o_custkey
jiang-# and l_orderkey = o_orderkey
jiang-# and o_orderdate < '1995-03-15'::date and l_shipdate > '1995-03-15'::date
jiang-# order by
jiang-# o_orderdate limit 10;id |                      operation                      |      A-time       | A-rows | E-rows |  Peak Memory  | A-width | E-width | E-costs  
----+-----------------------------------------------------+-------------------+--------+--------+---------------+---------+---------+----------1 | ->  Limit                                           | 419.741           |     10 |     10 | 2KB           |         |      16 | 13063.962 |    ->  Streaming (type: GATHER)                     | 419.738           |     10 |     10 | 176KB         |         |      16 | 13064.133 |       ->  Limit                                     | [415.101,416.042] |     30 |     18 | [2KB,2KB]     |         |      16 | 13063.384 |          ->  Sort                                   | [415.097,416.037] |     30 |     18 | [28KB,29KB]   | [32,32] |      16 | 13063.385 |             ->  Hash Join (6,7)                     | [413.825,414.770] |  25917 |     17 | [9KB,9KB]     |         |      16 | 13063.296 |                ->  Seq Scan on customer             | [10.589,10.882]   | 147100 | 147100 | [34KB,35KB]   |         |       4 | 1684.337 |                ->  Hash                             | [393.875,394.071] |  26500 |     17 | [840KB,840KB] | [44,44] |      24 | 11254.188 |                   ->  Streaming(type: REDISTRIBUTE) | [387.692,387.929] |  26500 |     17 | [70KB,70KB]   |         |      24 | 11254.189 |                      ->  Hash Join (10,11)          | [360.934,376.886] |  26500 |     17 | [10KB,10KB]   |         |      24 | 11253.6010 |                         ->  Seq Scan on lineitem    | [88.832,100.285]  | 565702 | 564893 | [41KB,41KB]   |         |       4 | 10763.0611 |                         ->  Hash                    | [199.541,202.174] | 727305 |     10 | [15MB,15MB]   | [48,48] |      28 | 14.1812 |                            ->  Seq Scan on orders   | [145.768,147.778] | 727305 |     10 | [33KB,33KB]   |         |      28 | 14.18
(12 rows)Predicate Information (identified by plan id)            
---------------------------------------------------------------------5 --Hash Join (6,7)Hash Cond: (customer.c_custkey = orders.o_custkey)9 --Hash Join (10,11)Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)10 --Seq Scan on lineitemFilter: (l_shipdate > '1995-03-15'::date), (LLVM Optimized)Rows Removed by Filter: 48287412 --Seq Scan on ordersFilter: (o_orderdate < '1995-03-15'::date)Rows Removed by Filter: 772695
(10 rows)Memory Information (identified by plan id)               
-----------------------------------------------------------------------Coordinator Query Peak Memory:Query Peak Memory: 2MBDatanode:Max Query Peak Memory: 1MBMin Query Peak Memory: 1MB4 --SortSort Method: top-N heapsort  Memory: 26kB ~ 26kBSort Method: top-N heapsort  Disk: 1024kB ~ 0kB7 --HashMax Buckets: 32768  Max Batches: 1  Max Memory Usage: 530kBMin Buckets: 32768  Min Batches: 1  Min Memory Usage: 511kB11 --HashMax Buckets: 32768  Max Batches: 1  Max Memory Usage: 15162kBMin Buckets: 32768  Min Batches: 1  Min Memory Usage: 15137kB
(14 rows)User Define Profiling                           
---------------------------------------------------------------------------Segment Id: 3  Track name: Datanode build connection(actual time=[0.179, 0.226], calls=[1, 1])Plan Node id: 2  Track name: coordinator get datanode connection(actual time=[0.030, 0.030], calls=[1, 1])Plan Node id: 2  Track name: Coordinator check and update node definition(actual time=[0.001, 0.001], calls=[1, 1])Plan Node id: 2  Track name: Coordinator serialize plan(actual time=[0.881, 0.881], calls=[1, 1])Plan Node id: 2  Track name: Coordinator send query id with sync(actual time=[0.246, 0.246], calls=[1, 1])Plan Node id: 2  Track name: Coordinator send begin command(actual time=[0.001, 0.001], calls=[1, 1])Plan Node id: 2  Track name: Coordinator start transaction and send query(actual time=[0.026, 0.026], calls=[1, 1])Plan Node id: 3  Track name: Datanode start up stream thread(actual time=[0.028, 0.030], calls=[1, 1])
(16 rows)====== Query Summary =====                                 
--------------------------------------------------------------------------------------------Datanode executor start time [dn_6007_6008_6009, dn_6004_6005_6006]: [0.337 ms,0.367 ms]Datanode executor run time [dn_6007_6008_6009, dn_6001_6002_6003]: [415.130 ms,416.059 ms]Datanode executor end time [dn_6001_6002_6003, dn_6004_6005_6006]: [0.069 ms,0.101 ms]Coordinator executor start time: 6.699 msCoordinator executor run time: 419.754 msCoordinator executor end time: 0.031 msPlanner runtime: 0.679 msPlan size: 6325 byteQuery Id: 72902018968532990Total runtime: 426.499 ms
(10 rows)

從 id=8 所在行可以看到,orders 和 customer 表進行關聯時由于分布列不同,customer 選擇了廣播的計劃,再和orders 表進行管理。之后orders+customer 的結果集具有orders 相同的分布列,所以可以和lineitem 在本地進行關聯。

實驗總結

本實驗通過調整數據表分布鍵的方法,對查詢進行了調優,選擇不同的分布鍵對查詢性能會產生一定的影響,主要遵循以下幾個原則:
1)選擇沒有顯著傾斜性的字段作為分布列;
2)盡可能選擇查詢中的關聯列作為表的分布鍵;
3)存在多個滿足上面條件的分布列時,盡可能選擇數據量較少的表進行重分布或廣播,優先滿足大表間的分布鍵統一。

思考題

選擇行存表的分布列的原則有哪些??

答案:
分布列選擇有以下建議:
選擇的分布列字段和分布算法能夠將表數據在均勻分布到各個 DN 節點;
該分布字段在執行 SQL 時經常被用于作為連接字段;
進行數據訪問時最大限度地減少跨 DN 節點數據訪問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96436.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#,RabbitMQ從入門到精通,.NET8.0(路由/分布式/主題/消費重復問題 /延遲隊列和死信隊列/消息持久化 )/RabbitMQ集群模式

為什么使用消息隊列 消息隊列&#xff08;MQ&#xff09;在分布式系統中用于解耦生產者和消費者&#xff0c;提高系統的異步處理能力、削峰填谷、增強可擴展性和可靠性。通過消息隊列&#xff0c;任務可以異步執行&#xff0c;避免系統因瞬時高并發而崩潰。 消息隊列場景 異…

OpenHarmony之SELinux安全組件底層原理設計架構精講

1. 組件介紹 1.1 核心功能 **SELinux(安全增強式Linux)**是Linux歷史上杰出的安全組件,包含一組內核修改和用戶空間工具,并提供了基于安全策略的強制訪問控制機制(Mandatory Access Control,MAC)。本部件負責對文件、屬性、服務等系統資源提供強制訪問控制保護,提供n…

IIS 部署 asp.net core 項目時,出現500.19、500.31問題的解決方案

目錄 &#xff08;一&#xff09;500.19 問題 1. 問題說明 2. 原因 3. 解決 &#xff08;二&#xff09;500.31 問題 1. 問題說明 2. 原因 打開事件檢視器的3種方式&#xff1a; 3. 解決 &#xff08;一&#xff09;500.19 問題 1. 問題說明 2. 原因 Web項目發布時&am…

中大型水閘安全監測的重要性及實施方法

水閘作為水利工程體系中的關鍵性構筑物&#xff0c;其結構安全性和運行可靠性直接影響到整個水利系統的穩定運行&#xff0c;更與下游地區人民群眾的生命財產安全息息相關。作為水利樞紐工程的重要控制節點&#xff0c;水閘承擔著防洪排澇、灌溉供水、航運發電等多重功能&#…

【芯片設計-信號完整性 SI 學習 1.1.1 -- Unit Interval,比特周期】

文章目錄1. Unit Interval (UI) / 比特周期 的定義2. 舉例說明3. 在眼圖 (Eye Diagram) 中的體現4. 示意圖(a) 單比特周期(b) 不同速率下的 UI(c) 眼圖中的 UI5. 總結1. Unit Interval (UI) / 比特周期 的定義 在高速信號傳輸與 信號完整性 (SI) 測試中&#xff0c;Unit Inter…

Go語言開發工具全解析

Go 語言的開發工具生態對于提高開發效率、保證代碼質量和團隊協作至關重要。一套完善的工具鏈可以幫助開發者&#xff1a;1. 加速編碼過程代碼模板快速生成常見模式例如使用代碼片段(Snippet)快速生成HTTP服務框架自動生成測試用例模板實時語法檢查減少錯誤即時顯示類型不匹配錯…

[郵件服務器core] 安全通信(SSL/TLS) | OpenSSL庫管理 | 服務端安全SECURITY.md

第5章&#xff1a;安全通信&#xff08;SSL/TLS&#xff09; 歡迎回來 在第4章&#xff1a;服務運行中&#xff0c;我們學習了如何啟動Dovecot郵件服務器并使其運行。 現在&#xff0c;我們的服務器已經啟動并準備好處理電子郵件&#xff0c;但有一個關鍵問題&#xff1a;我…

Lodash方法總結

目錄 1. _.defaults()為對象填充默認值 基本語法 功能說明 示例代碼 注意事項 與其他類似方法的區別 2. _.pickBy()刪除對象中值為空串或 null 的屬性 實現方法 代碼說明 擴展&#xff1a;深層過濾 3._.omitBy()移除滿足條件的屬性 基本語法 核心功能 示例代碼 1…

C#---Expression(表達式)

前言&#xff1a;Expression 是C# 高級編程&#xff0c;表達式的應用場景有 ORM框架&#xff1a;Entity Framework&#xff0c;Dapper等&#xff0c;規則引擎&#xff1a;動態業務規則評估&#xff0c; 依賴注入&#xff1a;高級DI容器實現&#xff0c;測試框架&#xff1a;模擬…

Lodash-es 完整開發指南:ES模塊化JavaScript工具庫實戰教程

簡介 Lodash-es 是 Lodash 庫的 ES 模塊版本&#xff0c;提供了大量實用的 JavaScript 工具函數。它支持按需導入&#xff0c;可以顯著減少打包體積&#xff0c;是現代 JavaScript 項目中的首選工具庫。 主要特性 ES 模塊支持: 完全支持 ES6 模塊語法按需導入: 只導入需要的…

26. AI-Agent-Dify

文章目錄前言一、Dify入門為什么使用 Dify&#xff1f;Dify 能做什么&#xff1f;二、Dify私有化部署Docker Compose 部署前提條件克隆 Dify 代碼啟動 Dify更新 Dify訪問 Dify自定義配置三、Dify構建企業級Agent應用定義如何使用智能助手添加助手需要的工具配置 Agent配置對話開…

云原生:微服務與Serverless指南

Copilot時代的開發者效能提升 代碼生成與補全&#xff1a;減少重復性編碼工作&#xff0c;加快開發速度錯誤檢測與修復&#xff1a;實時提示潛在問題&#xff0c;降低調試時間知識獲取與學習&#xff1a;幫助開發者快速掌握新語言或框架協作效率&#xff1a;通過AI輔助減少團隊…

SpringBoot + Apache Tika:一站式解決文件數據提取難題

在日常開發中&#xff0c;你是否也遇到過這樣的窘境&#xff1a;領導甩來需求“把用戶上傳的 Word、Excel、PDF 里的關鍵信息扒出來存庫”&#xff0c;你卻要對著不同格式逐個攻堅——解析 Word 用 POI 還要處理 .doc/.docx 兼容&#xff0c;解析 Excel 要啃合并單元格、公式計…

車牌模擬生成器:Python3.8+Opencv代碼實現與商業應用前景(C#、python 開發包SDK)

車牌模擬生成器&#xff1a;Python代碼實現與商業應用前景引言在智慧城市建設和汽車行業數字化浪潮中&#xff0c;車牌作為車輛的唯一標識&#xff0c;其相關技術應用正變得越來越重要。今天我們將介紹一個基于Python的車牌模擬生成器&#xff0c;探討其技術實現、功能特點以及…

小程序非主頁面的數據動作關聯主頁面的數據刷新操作

如果在主頁面跳轉到其他頁面。比如說我的收藏頁面&#xff0c;然后有取消收藏的動作&#xff0c;當返回到主頁面的時候&#xff0c;如果有關聯數據顯示在主頁面&#xff0c;刷新頁面對應的狀態。 下面的代碼是實現&#xff1a;//卡片收藏/取消if (newCollectd) {this.setData({…

后端(fastAPI)學習筆記(CLASS 1):擴展基礎

一、python的類型聲明1、類型聲明的背景和作用python 3.6 版本引入了“類型提示”1、類型提示是一種新的語法&#xff0c;用來聲明變量的類型2、提高編譯器和工具的支持能力為什么要學習類型提示1、了解類型提示不僅僅對使用FastAPI有幫助&#xff0c;也能提高代碼的可讀性度和…

2023年系統分析師上半年論文試題分析

試題一 論信息系統的可行性分析信息系統可行性分析的目的是確認在當前條件下企業是否有必要建設新系統&#xff0c;以及建設新系統的工作是否具備必要的條件。如何進行可行性分析是系統分析師所必須面臨的問題。請圍繞信息系統可行性分析論題&#xff0c;依次從以下三個方面進行…

洛谷 P1967 [NOIP 2013 提高組] 貨車運輸(kruskal 重構樹 + 求路徑最小邊權)

題目鏈接 題目難度 洛谷上是藍題&#xff0c;本人認為評高了&#xff0c;此題思維和實現都不難&#xff0c;應該是綠題。 題目解法概括 kruskal 重構樹 倍增優化求路徑最小邊權 代碼 #include <iostream> #include <cstdio> #include <vector> #inclu…

【01】針對開源收銀系統icepos (寶塔面板) 詳細安裝教程詳細參考-優雅草卓伊凡

【01】針對開源收銀系統icepos (寶塔面板) 詳細安裝教程詳細參考-優雅草卓伊凡引言本文做參考&#xff0c;下篇文章 直接實踐&#xff0c;由于已經選型本系統是服務端php開發的系統&#xff0c;他的系統環境如下&#xff1a;系統安裝 環境要求ICEPOS對服務器或電腦硬件要求不高…

MySQL的常用命令

目錄1. 連接MySQL數據庫基本連接語法連接參數說明2. 數據庫操作2.1 查看數據庫2.2 創建數據庫2.3 刪除數據庫3. 表操作3.1 查看表信息3.2 創建表3.3 常用數據類型3.4 修改表結構3.5 刪除表4. 數據操作 (CRUD)4.1 插入數據 (CREATE)4.2 查詢數據 (READ)基本查詢條件查詢排序和分…