实验介绍

本实验通过分析普通查询过程中存在的性能瓶颈点,通过执行计划的分析找到可能的性能优化点并加以实施,最终达到优化的效果,重点关注分布式关联相关查询语句的优化。

实验目的

了解通过合理定义分布列实现分布式关联的性能优化。

实验步骤

步骤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)基本查询条件查询排序和分…