MySQL 开发规范

在这里插入图片描述

优质博文:IT-BLOG-CN

一、设计原则

原则: SQL开发规范制定是基于良好的编码习惯和可读性;
目的: 消除冗余,数据简约,提高效率,提高安全;
【1】禁止在线上生产环境做数据库压力测试,全链路压测可以支持,但是一定不要在业务高峰期搞压力测试。
【2】禁止在数据库中明文存储密码和敏感信息,可能信安部门回来找你。
【3】禁止从开发、测试环境直连线上生产数据库,一般会做网络隔离,可能也连不上。
【4】禁止将业务日志实时保存到数据库。具体看情况,一些重要的也可以,但是程序日志就不要放进去,可以放到ClickHostES之类的产品。
【5】业务部门推广活动,需要提起通知DBA
【6】任何语句使用前通过EXPLAIN查看执行计划是否用到索引:链接
【7】不要从明细表查统计结果,定期统计插入到汇总表:这个做互联网的深有感触,一张表几千万的数据,统计一个数据,性能真心很低。

EXPLAIN
SELECT COUNT(user_no) AS u_no,
SUM(bid_no) AS b_no
FROM user
WHERE registered_date >= '2013-02-07 18:11:40';

Query_time: 18.229131 Lock_time: 0.000474 Rows_sent: 0 Rows_examined:100289

注:从明细表查询时检索记录数为100289,从汇总表查询时检索记录数为1,需要改为从汇总表查询。

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMEPLEuserALL100289Using where

【8】禁止使用子查询,MySQL不像SqlServer等其他数据库,它对子查询的力度支持比较低。
【9】update/delete/replace只能单表操作,必须基于主键操作,删除表操作,建议使用truncate。假设写一个大事务,MySQL先写replay_log在写bin_log,如果特别大,bin_log是顺序写,会阻塞别的事务提交。
【10】不允许出现多于一次的join,需要join的字段,数据类型保持绝对一致,多表关联时,保证被关联的字段有索引。与子查询一致,因为join和子查询是可以相互转换的。
【11】数据订正update/delete时,要先select避免出现误删除,确认无误再执行更新语句。
【12】insert语句要显示指定插入的列明,且不允许使用insert...selectreplace...select这样的bulk insert形式。
【13】不允许再查询语句中使用hint类似的语法:sql_no_cacheforce indexignore keystraight join等。
【14】不要频繁在数据库中做运算符操作,如count()/sum()/md5()/order by rand()等,需要控制QPS,对CPU消耗是很高的,特别是countsum他有可能会扫描整个索引。
【15】不要使用大偏移量的limit,正例:where id > N limit M 反例:where ? limit N,MN越来越大的时候,相当于没用limit
【16】禁止使用SELECT *,必须指定字段名称,同样,INSERT后边需要指定字段;
【17】明细统计时,只统计编码,不要关联名称等冗余字段。注:名称显示可查询全局hashtable(写 300万/秒 读1200万/秒)。
其他KV工具:Memcached(读写 8万/秒,多线程更快,适合小数据)Redis(读写10万/秒,单线程,可多进程,适合大数据和复杂数据结构)注:一般phpMemcachedJavaRedis,小量数据时推荐static变量。
【18】联合查询时,每个表必须加别名,否则系统需要自己生成别名,影响性能。关联字段必须是索引(最好是主键),where条件用以过滤主表;注:提高SQL解析效率,便于代码阅读,注意字段前边也要加别名。

--问题语句:bid_no 就没有指定别名
SELECT a.*, b.user_name
FROM user a
LEFT JOIN class_name b
ON a.uid = b.uid AND b.student = 0
WHERE bid_no = '31001383713';

【19】每个查询结果集使用的内存量不要超过256M,可以通过时间范围控制,如RK BETWEEN A AND B,大表可按小时操作。注:可通过分批查询返回大量数据;

SELECT user_no, bid_no, evaluate_no, registered_date, updated_date, operator, time_stamp FROM user;
Query_time: 239.269626 Lock_time: 0.000151 Rows_sent: 2271775 Rows_examined: 2271775

【20】页面查询在10秒内要返回结果,服务器超时限制默认为65秒。定期查看慢查询日志xxx-slow.log。注:show variables like '%cache%' 查看query cache是否足够大和命中率;

Query_time: 67.432783 Lock_time: 0.000373 Rows_sent: 1 Rows_examined: 168671

【21】语句中避免子查询,子查询无法使用索引(少数子查询使用索引,参考执行计划)。注:子查询结果集记录极少时可以使用,否则效率很差;
【22】语句中避免使用GROUP BY,可通过批量程序定期汇总。注:频繁GROUP BY需要创建临时结果集;

SELECT MIN (b.bid_no) FROM user b
GROUP BY b.bid_no

【23】禁止语句级并行;
【24】大表join用临时表代替create temporary table
【25】链接MySQL不要设置成autocommit=0,否则就隐式的开启了一个事务;
【26】线上尽量少使用大量查询,将复杂SQL拆分成多条简单SQL,化繁为简;
【27】如果结果集不需要去重,尽量改写unionunion all
【28】ORDER BY语句对多个不同条件使用不同方向的排序无法使用索引,请尽量避免或在程序端进行排序;

二、建表规范

【1】存储引擎必须是InnoDB,因为只有这一个引擎支持事务,还有InnoDB有许多好的特性,比如ChannlBuffer对写入和修改特别友好。double write保护机制对数据一致性要求比较高,读上面有一些Handler_read来保证读写能力;
【2】必须有显示主键,如果不设置主键,MySQL会给一个隐藏主键。会影响查询效率。如果进行修改的时候,数据库是根据唯一主键进行处理的,如果没有主键,可能会扫描全表,造成数据库延迟;
【3】推荐使用独立业务的AUTO_INCREMENT列做主键,禁止使用多字段联合主键;好处就是主键是连续的,再InnoDBB+树那么存储的空间就会更加紧密。不要有业务意义主要是为了方便业务的操作。如果使用联合索引特别长的话,会影响Table get的点查;
【4】不要使用UUID/MD5/HASH等函数生成的无序值做主键,会导致页的分裂;
【5】字符集必须是utf8mb4MySQL对字符集的匹配机制做的不是特别好,比如utf8utf8mb4做一些join运算,会进行一些隐式类型转换,可能找不到索引;
【6】字段声明NOT NULL,且必须显示指定默认值。NULL比较空,如果进行COUNT(name)的时候,Null是不进行统计的,Sum(age)如果有NULL的话,计算出来的值也是NULL;
【7】库名、表名、字段名禁用保留字,如descrangmatchdelayed等;
【8】对表和字段都添加备注说明;
【9】主键列如果为整型,统一使用bigint,因为int可能会溢出;
【10】库名、表名字段都是小写;
【11】必须包含时间戳字段datachange_lasttime,定义默认值为CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,并添加索引,CD发布平台会自动创建;
【12】datachange_createtime作为创建时间,定义默认值时不要添加on update CURRENT_TIMESTAMP,直接设置为CURRENT_TIMESTAMP即可;

三、字段设计

【1】尽可能使用更小的数据类型,如TINYINTSMALLINTMEDIUMINTINTBIGINT。注:int(11)的11代表客户端显示宽度,并不是取值范围,精度:tinyint -2^8-2^8-1 smallint - 2^15-2^15-1 int -2^31-2^31-1 bigint -2^63-2^63-1

--问题语句:int 类型长度应该根据实际设定
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(32) NOT NULL DEFAULT '',`bid_no` int(32) NULL DEFAULT NULL,`evaluate_no` int(32) NULL DEFAULT NULL,`registered_date` datetime NULL DEFAULT NULL,`updated_date` datetime NULL DEFAULT NULL,`operator` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,`time_stamp` datetime NULL DEFAULT NULL,PRIMARY KEY USING BTREE (`user_no`)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【2】尽量少用TEXTBLOBCLOB、影像等专有类型的二进制数据 (大数据如图片等可用链接代替),注:CLOB等类型在性能和兼容性表现不好,会有带宽问题,将IO或者网络带宽打爆,Text字段正常是不能使用索引的。再就是MySQL不适合存放这些东西,还需要自己去解压,建议使用分布式文件系统等存储;

--问题语句:after_value_text 字段使用了 CLOB
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(11) NOT NULL DEFAULT '',`bid_no` int(11) NULL DEFAULT NULL,`evaluate_no` int(11) NULL DEFAULT NULL,`after_value_text` CLOB,PRIMARY KEY USING BTREE (`user_no`)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【3】相同属性对应的数据类型,如字符型,数值型不能混合使用,依赖后期转换;

--问题语句:默认bid_no 应该是 int,否则需要隐式转化
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(11) NOT NULL DEFAULT '',`bid_no`  char(11) NULL DEFAULT NULL,PRIMARY KEY USING BTREE (`user_no`)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【4】相同字段不同表中的类型和长度要一致;
【5】字段名称不能使用关键字;
【6】不要指定字段级编码,建议全库统一。可以设置编码的有数据源、表,语句。如果语句中没有设置编码就会遵循表的编码,表的编码不存在时,则遵循数据源的编码,注:字段级编码在导入导出时可能乱码;
【7】默认值要规范,例如日期不要使用0000-00-00

--问题语句:特有默认值在 ETL 时会导致异常
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(11) NOT NULL DEFAULT '',`bid_no` int(11) NULL DEFAULT NULL,`time_stamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY USING BTREE (`user_no`)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【8】不要用自增ID做主键,无法同步,无约束意义。自增在分表分库的业务场景下也不实用,容易导致主键ID冲突。注:字段设计需要精雕细琢,尽量符合三范式,确定没有索引的表可以使用自增主键;

--问题语句:user_no 使用了自增
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID号',`bid_no` int(11) NULL DEFAULT NULL,PRIMARY KEY USING BTREE (`user_no`)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【9】不要使用外键和触发器,注:外键和触发器不适合大数据;
【10】事务相关记录保留时间戳,建议只增不改;在必须对记录进行修改的时候,保留更改时间戳;

-- 正确示例:可用于同步和跟踪
ctime datetime NOT NULL COMMENT '创建时间',
utime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'

【11】精度要求高的字段使用decimal(number, numeric)代替double, float(real)。需要选对场景:精度要求非常高的计算中,要保证有效数字的总个数足够多,需要使用decimal。注:用在与金额有关的地方;
【12】禁止非英文字段名称,使用中文字段名会创造很多困难点;

四、索引使用

【1】对较长的字符类型,如果需要索引,则建立前缀索引,前缀索引长度控制在20个字符以内,索引不能超过767个字节,这个也可以通过设计加长,但是太长也会影响效率;
【2】组合索引字段的顺序,去重之后数量越多代表区分度越高,区分度越高的字段排在前面;
【3】每个查询必须用到索引 (小表可能全表更好,视数据量决定)。注:如果没有索引,即使加了rownum=1,也会全表扫描;

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMEPLEuserrangPRIMARYPRIMARY412Using where
【4】建立组合索引时,WHERE条件中用到等于的字段放前边,用到范围的字段放后边。注:如 DD=100000 AND SJ BETWEEN A AND B
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
----------------------------------------
1SIMEPLEuserrangp_nop_no1012Using where
【5】删除重复字段的索引,减少 DML IO。注:索引过多影响操作效率,重复索引可能导致执行计划异常;
--问题语句:下面的 key 属于重复key 第一个可以删除掉
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID号',`bid_no` int(11) NULL DEFAULT NULL,PRIMARY KEY USING BTREE (`user_no`),KEY RoadLineID (`bid_no`),KEY RoadLineID2 (`bid_no`,`evaluate_no`)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【6】除了主键外,避免建立其他唯一性索引。注:业务逻辑通过业务应用控制,数据库设计时要选择正确的主键;

--问题语句:bid_no 数据量大的话不应该定义为唯一索引
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`user_no` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID号',`bid_no` int(11) NULL DEFAULT NULL,PRIMARY KEY USING BTREE (`user_no`),UNIQUE KEY index_bid_no (bid_no)
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

【7】索引中重复的记录数越少,效率越高,效率最高的是主键。注:如果同一记录超过50%,全表扫描定期analyze table收集统计信息和直方图,如果可以加not null的最好加上。例如性别这个字段就不适合体检索引;
【8】索引字段最好不要存在NULLNULL可用0替代,建议把默认值设置为0。注:在null远多于非null的情况下,建议表设计 default 0
【9】组合索引可以只使用第一个,或者前两个,或者前几个,不能从第二个开始用,也不能跳着使用。注:索引使用从前缀开始,多字段索引到between或者<,>等以后字段不会使用索引,排序最好在索引中实现;
【10】关联查询用到的索引的编码必须一致,建议都采用UTF-8。注:如果编码不一致,索引无效;
【11】一般情况下,一次查询只会用到一个索引。特定情况出现merge index的情况,如下可能出现 ( a=1 or b=2 ) 会合并 a 和 b 的索引,或者使用union all。因为or会破坏索引的最左原则;
【12】每个表索引越少越好,建议1-3个,最多5个 (oltp 1-5,olap 5以上)。注:表索引过多影响写和更新操作效率, GreenPlum数据库可合理利用分区和分布键,线上就碰到过索引比表还大;
【13】where a = '1'如果aint,查询字段值为字符类型,这样会有隐式转换,无法使用索引,但是a如果是字符类型,a = 1却能用到索引;
【14】in后面的集合元素的数量,尽量控制在200个以内,MySQL主要根据查询字段占比决定是否走索引;

五、查询条件

【1】SQL语句的WHERE条件避免使用无效条件、无效括号、无效排序,如 (1=1)order by。注:示例语句中使用了无效条件、无效括号,对性能有极大影响;

--问题语句:
SELECT user_no, bid_no, evaluate_no
FROM user
WHERE (1=1)
AND ( (user_no LIKE '%') AND (bid_no LIKE '%') )
AND ( evaluate_no <> 0 )
AND ( operator <> 0 )
ORDER BY user_no ASC;
Query_time: 10.688586 Lock_time: 0.000070 Rows_sent: 55561 Rows_examined: 59075

【2】SQL语句中不要加用不到的排序。注:类似order by null等无效排序会影响执行效率;
【3】控制临时结果集,包括中间结果和中间排序。注:合理横向和纵向拆分,一次处理数据量不要太大;

select * from v$sort_usage,show status like %temp%;

【4】WHERE条件中最好不要用INLIKE。注:可使用exists代替in, 使用=代替like
【5】WHERE条件中不要使用NOW()等进行判断,避免影响执行计划。注:使用now()的存储过程无法重复运行,且影响执行计划;
【6】禁止使用未经认证的hint,如SELECT SQL_NO_CACHE f FROM t。注:使用标准SQL,便于版本间兼容;
【7】索引相关字段不要使用函数或者进行运算,如field1 + 1 = field2ADDDATE(field1,…CAST。注:大多数字段使用函数不会使用索引,只有确定性function使用函数索引;

--问题语句:会导致索引失效
SELECT * FROM user WHERE CAST(CONCAT(updated_date, ' ', time_stamp) AS datetime) BETWEEN '2014-06-10 10:30:00'

【8】禁止字段格式转换,如SELECT x FROM GS WHERE BM=200000,数值两边不要加引号。注:要区分数值、日期和字符串,科学计数法更要慎重使用;

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMEPLEuserrefp_nop_no5const50144Using where

六、存储过程

MySQL尽量不要使用外键、存储过程、视图、触发器。在互联网公司都不希望用外键,因为外键对性能的损耗比较严重。在SQL Server时期存储过程是一个好设计,但在MySQL不是一个好设计,主要是因为两者的实现逻辑不同,在SqlServer中存储过程能够应用程二级制码的,效率非常高,而且可以进行提前做一个plan cash的解析,但在MySQL没有上述的逻辑,所以实现不是很好。
【1】存储过程中操作的记录数超过1000条时不能使用游标 (可用临时表代替,禁止使用触发器、自定义函数)。注:也不能使用 while,大批量数据操作对应脚本必须进行压力测试,以保证可用性;
【2】在存储过程的关键步骤开始和结束都要记录信息到日志表,用于监控和调试。注:提交要及时,记录要详细;
【3】 使用标准操作符,不要使用双引号、!= 等过渡性操作符。注:非标准操作符可能导致其他无法预期问题;
【4】存储过程要能够重复执行,执行时需要清空历史冲突记录。注:非常重要,多种情况下需要存储过程重复运行;
【5】使用自制事务(autonomous transaction)控制写日志,独立日志操作存储过程。注:用以避免回滚时无法记录日志;
【6】所有过程必须定义异常处理,并自定义错误代码,从-20001开始;

CREATE OR REPLACE PROCEDURE ap AS
BEGINNULL;--body
EXCEPTIONWHEN OTHERSTHENNULL;-- exception handler
END;

【7】过程避免每条语句提交。注:控制提交频率大于1秒;
【8】禁止使用递归。注:使用递归时,性能消耗无法控制;

七、远程表

【1】远程表结构要与原始表一致,尤其是索引。注:同时编码要一致;
【2】远程表数据不要大于256M,远程表的 WHERE 无效。注:远程表先下载到本地,再进行其他操作,所以不宜过大;
【3】远程表一般用来全表小数据全量同步。注:远程表大数据操作时很慢;
【4】远程表操作完毕提交操作。注:默认远程表只用来读操作,如果进行写操作,则锁全表;

八、性能优化

【1】 文件格式改为XFS可以提升5%,增加1/6磁盘可以提升1/6,优化索引和结构,一般可以提升100-1000倍。注:了解SQL原理,让数据经过一次读操作即能返回结果时最快;
【2】使用TYPE=HEAP的临时表。注:适合频繁删除和更新;

九、引擎使用

【1】使用INNODB引擎操作大批量数据时,在过程结尾提交,避免过度COMMIT。注:通过事务提交可以提高大数据操作效率,同时有序插入、合并插入也可以大幅提高数据库效率。

--正确语句:
START TRANSACTION;
INSERT INTO t(datetime, UID, content, TYPE) VALUES ('0', 'userid_0', 'content_0', 0),('1','userid_1', 'content_1', 1);
INSERT INTO t(datetime, UID, content, TYPE) VALUES ('2', 'userid_2', 'content_2', 2),('3','userid_3', 'content_3', 3);
COMMIT;

【2】避免跨引擎操作,如表分别为InnodBMyISAM。问题语句:(不能用函数、需要有索引、先汇总再关联、要查汇总表、表引擎要一致、表编码要一致、字段类型要一致)。注:跨引擎操作时,事务失效,推荐都使用InnodB

十 、权限控制

【1】PHP连接MYSQL的用户只分配对应库SIUD。注:权限越大,被攻击时受到的破坏越大。注:权限越大,被攻击时受到的破坏越大;
【2】所有客户端提交的变量都要进行转义操作,防止非法注入。注:可通过工具AppScan统一检测;

-- 问题脚本:
$username = isset($_REQUEST["username"]) ? $_REQUEST["username"] : "";
$sql_gh="select EMPID,USERPASS,EMPSTATUS from ydserver.yd_cas_emp where EMPID='$username'";

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频监控管理系统EasyCVR平台设备增删改操作不生效是什么原因?

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…

数据结构——线性表顺序表示详解

目录 1.线性表的类型定义 2.基本操作 3.线性表的存储结构 4.补充 1.元素类型说明 2.数组定义​编辑 3.c语言的内存动态分配 4.c的动态存储分配 5.c中的参数传递 引用类型作参数 6.顺序表基本操作的实现 1.线性表的初始化 代码示例&#xff1a; 2.销毁线性表&…

什么是光伏气象站?—气象科普

光伏气象站&#xff0c;也称为光伏环境监测仪&#xff0c;是一种专门针对光伏发电站研发生产的环境监测系统。它主要利用太阳能电池板将太阳能转化为电能&#xff0c;并配备有气象监测设备以实时监测和记录气象数据。这些数据对于评估光伏电站的性能、效率和故障诊断至关重要&a…

SV-7045网络草坪音箱安装说明 景区园区背景音乐广播石头音箱

SV-7045网络草坪音箱安装说明 景区园区背景音乐广播石头音箱 在做室外公共广播/背景音乐系统时&#xff0c;对于草坪音箱的安装方法,大家可能不甚了解&#xff0c;所以将具体安装方法作简要说明。 音箱安装步骤如下&#xff1a; 1.测量草地音箱的底座尺寸大小&#xff0c;最…

Linux 多线程开发

第三章 Linux 多线程开发 3.1 线程3.1.2 线程操作3.1.2 线程属性 3.2 线程同步3.2.1 互斥量/锁3.2.2 死锁3.2.3 读写锁 3.3 生产者消费者模型3.3.1 条件变量3.3.2 信号量/灯 网络编程系列文章&#xff1a; 第1章 Linux系统编程入门&#xff08;上&#xff09; 第1章 Linux系统…

TSINGSEE青犀煤矿矿井视频监控与汇聚融合管理视频监管平台建设方案

一、背景需求 随着我国经济的飞速发展&#xff0c;煤炭作为我国的主要能源之一&#xff0c;其开采和利用的重要性不言而喻。然而&#xff0c;煤矿事故频发&#xff0c;不仅造成了巨大的人员伤亡和财产损失&#xff0c;也对社会产生了深远的负面影响。视频监控系统作为实现煤矿智…

【Rockchip android7.1 平台rtl8821cs wifi移植调试】

Rockchip 平台rtl8821cs wifi移植调试 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip rk3128 OS:Android 7.1.2 Kernel: 3.10 问题描述 客户需要在现在的板子上调一款RTL882…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;在零售行业的技术进步中&#xff0c;开发商品识别系统扮演着关键角色。本博文详细阐述了如何利用深度学习技术搭建一个高效的商品识别系统&#xff0c;并分享了一套完整的代码实现。系统采用了性能强劲的YOLOv8算法&#xff0c;同时对YOLOv7、YOLOv6、YOLOv5等…

华为OD机试 - 字符串化繁为简(Java 2024 C卷 200分)

目录 专栏导读一、题目描述示例&#xff1a; 二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&…

2024蓝桥杯每日一题(区间合并)

一、第一题&#xff1a;挤牛奶 解题思路&#xff1a;区间合并 区间合并模板题 【Python程序代码】 n int(input()) a [] for i in range(n):l,r map(int,input().split())a.append([l,r]) def cmp(x):return x[0],x[1] a.sort(keycmp) res1,res20,0 st,ed a[0][0…

visualization_msgs::Marker 的pose设置,map坐标系的3d box显示问题

3D框显示 3D框显示可以使用visualization_msgs::Marker::LINE_LIST或者LINE_STRIP&#xff0c;前者使用方法需要指明线的两个端点&#xff0c;后者自动连接相邻两个点。 姿态问题 网上看了一些&#xff0c;没有涉及到朝向设置&#xff0c;Pose.orientation默认构造为4个0 至…

Python环境下一维时间序列的小波尺度谱和时间平均小波谱(基于Morlet小波)

小波分析是较好的非平稳信号分析方法之一&#xff0c;它通过伸缩和平移运算对信号进行多尺度细化分析&#xff0c;能够在不同的尺度上描述信号的局部特征&#xff0c;为微弱故障特征信号的检测提供了有效的工具。小波尺度谱可看作一个有恒定相对带宽的谱图&#xff0c;能够反映…

Java剖析 : HashMap底层存储数据的结构 | HashSet添加不重复元素底层原理

HashSet底层剖析 前言&#xff1a; 我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; ★ HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c…

OpenAI:ChatGPT API 文档之 Embedding

在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间&#xff08;embedding space&#xff09;&#xff0c;而生成的向量则称为嵌入向量&#xff08;embedding vector&#xff0…

14---DVI电路设计

视频链接 DVI硬件电路设计01_哔哩哔哩_bilibili DVI电路设计 1、DVI的简介 DVI(Digital Visual Interface)&#xff0c;即数字视频接口。它是1998年9月&#xff0c;在Intel开发者论坛上成立的&#xff0c;由Silicon Image、Intel(英特尔)、Compaq(康柏)、IBM(国际商业机器公…

时序数据库:TDengine整体架构

文章目录 [toc]一、集群与基本逻辑单元1.主要逻辑单元2.节点之间的通讯3.一个典型的消息流程 二、存储模型与数据分区、分片1.存储模型2.数据分片3.数据分区4.负载均衡 三、数据写入与复制流程1.Master Vnode 写入流程2.Slave Vnode 写入流程3.主从选择4.同步复制 四、缓存与持…

五 超级数据查看器 讲解稿 列表功能2

五 超级数据查看器 讲解稿 列表功能2 点击此处 以新页面 打开B站 播放教学视频 点此下载 百度手机助手 下载地址4 讲解稿全文&#xff1a; 大家好&#xff0c;今天我们讲解一下&#xff0c;超级数据查看器列表界面&#xff0c;分为1-2两集。这是第二集 继续讲解弹出式菜单…

Linux环境(Ubuntu)上的防火墙工具使用方法

目录 概述 1 防火墙工具&#xff08;ufw&#xff09; 1.1 安装防火墙工具&#xff1a; 1.2 操作防火墙相关命令 2 ufw操作命令的范例 2.1 打开/关闭防火墙 2.1.1 打开防火墙 2.1.2 关闭防火墙 2.1.3 查询当前防火墙状态 2.1.4 允许选择的端口访问 2.1.5 允许选择固定…

【数据结构】线性表的定义及基本操作

文章目录 前言线性表的定义线性表的基本操作基本操作其他常用操作 总结 前言 数据结构的三要素是逻辑结构、数据的运算、存储结构&#xff08;物理结构&#xff09;&#xff0c;存储结构不同&#xff0c;运算的实现方式也不同。 本次文章包括线性表的定义和基本操作&#xff0…

java零基础入门-map(上)

一、教学目标 掌握何为map能够说出map集合的特点。能够使用map集合添加元素、删除元素等伴生方法。 二、正文 1、概述 说起map&#xff0c;想必大家并不陌生吧。之前我在讲Collection集合的时候&#xff0c;我是给大家提过一嘴&#xff0c;我说Collection集合被称为单列集合…