MySQL 性能调优:打造高效数据库
SQL 语句层面的性能调优策略
合理选择字段属性
在创建 MySQL 表时,为了获取更好的性能,选择合适的字段属性至关重要。
首先,要依据实际情况合理设置字段的类型及宽度。例如,对于像手机号码这类固定长度为 11 位的字段,直接设置为CHAR(11)就很合适,使用VARCHAR类型反而多余。又如,在定义邮政编码字段时,如果将其设置为CHAR(255),显然会给数据库增加不必要的空间,其实CHAR(6)就足以完成任务;对于整型字段,若可以的话,应尽量使用MEDIUMINT而不是BIGINT。
同时,尽量把字段设置为NOT NULL。这样在执行查询的时候,数据库不用去比较NULL值,能够减少不必要的判断操作,提升查询速度。例如,某些已知不会出现空值的字段,明确设置为NOT NULL能优化查询性能。
另外,对于某些文本字段,像 “省份” 或者 “性别” 等取值相对固定且有限的情况,可以将它们定义为ENUM类型。因为在 MySQL 中,ENUM类型被当作数值型数据来处理,而数值型数据的处理速度要比文本类型快得多,进而提高数据库的整体性能。
巧用连接代替子查询
在 MySQL 中,使用连接(JOIN)替代子查询(Sub-Queries)往往能带来性能上的提升。
子查询是指在一个 SQL 语句中嵌套另一个完整的 SQL 查询,它可以作为主查询的一部分,也可以放在WHERE、FROM或HAVING子句中。其执行顺序是先执行子查询,然后将结果作为外部查询的条件或数据源。虽然子查询在某些场景下很有用,能一次性完成很多逻辑上需要多个步骤的 SQL 操作,还可避免事务或者表锁死,写起来也较为容易,但在处理大量数据时,子查询的执行需要额外的计算和 I/O 操作,可能会导致性能瓶颈。
而连接(JOIN)操作通常在数据库查询优化器中能被更好地优化,有着诸多优势。比如,它可以减少查询次数。举个例子,假设有两张表:orders(订单表)和customers(客户表),若想找出所有已完成订单的客户信息,使用子查询可能会这样写:
SELECT * FROM customers WHERE customer_id IN(SELECT customer_id FROM orders WHERE status='completed');
这里的子查询(SELECT customer_id FROM orders WHERE status = 'completed')将会针对每个客户执行一次。但如果使用连接查询来完成同样的任务,像下面这样:
SELECT customers.* FROM customers JOIN orders ON customers.customer_id = orders.customer_id WHERE orders.status='completed';
这个查询只需要执行一次,减少了查询次数,从而提高了效率。
连接查询还能优化查询计划,子查询有时会影响查询优化器的判断,导致不够优化的执行计划,而连接查询更容易被优化器理解和处理,通过将子查询转换为连接查询,可帮助优化器更好地理解查询意图,生成更有效的执行计划。
并且,连接查询能减少数据传输开销。例如在查询每个客户的订单数量时,若使用子查询,可能会这样写:
SELECT customer_id,(SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id) as order_count FROM customers;
每个子查询都会返回一个单独的结果,并且需要将这些结果传输回主查询,增加了数据传输量。而使用连接查询:
SELECT customers.customer_id,COUNT(orders.order_id) as order_count FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customers.customer_id;
通过一次查询就获得了所需的客户和对应的订单数量,避免了不必要的数据传输。
此外,连接查询可以更好地利用索引,子查询可能会导致索引的低效使用或无法使用索引的情况,而连接查询能让索引发挥更好的作用,提升查询效率。连接方式有多种,像内连接、外连接(包括左连接、右连接等),不同的连接方式适用于不同的场景,需要根据实际的业务逻辑和表关系来合理选择使用。
善用联合取代临时表
在 MySQL 中,可以使用联合(UNION)查询来替代手动创建临时表,这有助于提升数据库整体的整齐与高效性。
从 MySQL 4.0 版本开始支持UNION查询,它能够把需要使用临时表的两条或更多的SELECT查询合并成一个查询。在客户端的查询会话结束的时候,临时表会被自动删除,无需手动去清理,从而保证数据库环境的整齐。
使用UNION来创建查询的时候,只需要用UNION作为关键字把多个SELECT语句连接起来就行,但要特别注意的是,所有SELECT语句中的字段数目必须相同。例如,有以下两个查询语句:
SELECT column1, column2 FROM table1;
SELECT column1, column2 FROM table2;
就可以通过UNION将它们合并为一个查询,像这样:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
这样一来,原本可能需要手动创建临时表来存储中间结果的操作就可以简化,避免了临时表带来的一些诸如占用额外内存、管理维护复杂等问题,让数据库运行更加高效。
不过在使用UNION时也有一些细节需要留意,它默认会去除重复的记录,如果不想去除重复记录,可以使用UNION ALL,其效率通常会比UNION更高一些,因为无需进行去重的额外操作。总之,根据实际需求合理运用UNION,能在很多场景下替代临时表发挥很好的作用。
优化查询语句细节
在编写 SQL 查询语句时,注意一些细节方面的优化,能够有效减少 I/O 次数与 CPU 计算量,提升数据库性能。
首先,要尽量避免全表查询。通常应先考虑在WHERE及ORDER BY涉及的列上建立索引,这样数据库在执行查询时就能通过索引快速定位到需要的数据,而不是去扫描整张表。例如,对于经常在查询条件中使用的字段,像根据用户 ID 查询用户信息时,在用户表的用户 ID 字段上建立索引,能大大加快查询速度。
合理使用索引也非常关键。不是所有的字段都适合建立索引,对于那些含有大量重复值的字段,最好不要建立索引,因为这样的索引对查询效率的提升作用不大,反而会增加额外的磁盘空间占用以及在数据更新(如插入、更新、删除操作)时的开销,毕竟更新表时,MySQL 不仅要保存数据,还要维护索引文件。同时,在建有索引的字段上尽量不要进行函数操作、表达式操作,也不要在WHERE子句里对索引列使用不等于(!=或<>)操作符等,否则可能会导致索引失效,使数据库引擎放弃使用索引而进行全表扫描。比如,像这样的查询语句SELECT id FROM t WHERE num/2 = 100就不太好,应改为SELECT id FROM t WHERE num = 100 * 2,以此来保证索引能正常发挥作用。
减少排序操作也不容忽视。排序操作往往会消耗较多的资源,如果业务需求中需要对结果内容进行排序处理,那么尽量在索引列中完成排序,也就是让WHERE条件和ORDER BY使用相同的索引,并且ORDER BY的顺序和索引顺序相同,同时字段的排序方式(升序或降序)保持一致,这样有可能通过有序索引顺序扫描直接返回有序数据,避免额外的排序开销,即实现using index,操作效率会比较高;否则就可能出现File Sort,导致效率降低。
另外,要避免复杂运算,例如尽量不要在WHERE子句中的 “=” 左边进行函数、算术运算或其他表达式运算,不然系统可能无法正确使用索引。像SELECT id FROM t WHERE substring(name,1,3) = ’abc’这样的语句,为了利用索引优化查询,可以改为SELECT id FROM t WHERE name like ‘abc%’。总之,在编写 SQL 语句时多关注这些细节,能让查询性能得到显著提升。
数据库设计层面的性能调优要点
选择合适存储引擎
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点与适用场景,合理选择存储引擎对于数据库性能的优化至关重要。
InnoDB 是 MySQL 5.5 及以后版本的默认存储引擎,它具备强大的事务支持能力,遵循原子性、一致性、隔离性和持久性(ACID)原则,能够确保一系列操作要么全部成功,要么全部失败,保证了数据的一致性和完整性。在并发控制方面,InnoDB 支持多版本并发控制算法(MVCC)、两段锁协议(2PL)等,还提供行级锁以及外键约束,这使得在多人同时访问数据库时,它可以更好地处理并发操作,减少锁冲突,提升系统整体性能。其索引类型采用 B + 树索引,支持聚簇索引和辅助索引,聚簇索引决定了数据的物理存储顺序,让范围查询和排序操作更加高效。InnoDB 适用于大多数应用程序场景,尤其是那些需要处理大量并发访问和复杂数据操作,对数据完整性要求较高的情况,比如金融系统、电商网站等。
MyISAM 存储引擎的优势在于访问速度较快,不过主要是针对读操作而言(因为它是表级锁,读操作可以并发进行),但它不支持事务处理和行级锁定,所以在写操作进行时,会阻塞其他会话对该表的写操作,并发性能相对受限。不过,它是 MySQL 唯一支持全文索引的存储引擎,适合用于对文本数据进行快速搜索和匹配的场景,例如在新闻网站、博客系统等读多写少、数据完整性要求不高的应用中使用较为合适。
Memory 存储引擎则将数据完全存储在内存当中,基于哈希表的数据结构实现快速存储和检索,读写速度非常快,但牺牲了持久化和数据安全性,一旦 MySQL 服务器重启或者崩溃后关闭,表中的数据就会丢失。所以它通常适用于对数据持久性要求不高、但需要快速读写操作的场景,比如缓存系统、临时数据存储、会话管理等情况。
例如,在一个以展示新闻文章为主的网站中,文章数据的查询操作远多于修改、删除等写操作,并且对数据完整性要求并非极其严格,那么使用 MyISAM 存储引擎来存储文章表,就能利用其快速的读性能优势,提升用户获取文章内容的效率;而对于该网站的用户登录会话管理相关的数据表,由于这些数据在服务器运行期间频繁读写且对持久化要求不高,使用 Memory 存储引擎则可以加快处理速度,提升用户体验。总之,要根据实际业务需求来权衡各存储引擎的特点,做出合适的选择,从而保障数据库性能良好。
控制表结构设计
在设计表结构时,在满足业务需求的前提下,通过一些合理的设计策略来精简表结构,可以有效提升数据库性能。
首先,尽量精简字段宽度。数据库中的表越小,在其上执行查询也就越快。比如,对于像手机号码这类固定长度为 11 位的字段,将其定义为CHAR(11)就恰到好处,若使用VARCHAR类型,不仅会多占用一些不必要的空间,还可能在一定程度上影响性能。再如邮政编码字段,通常设置为CHAR(6)就足以满足存储需求,如果定义为CHAR(255),明显会给数据库增加多余的空间负担。对于整型字段,在数据范围允许的情况下,应尽量选择占用空间更小的数据类型,例如可以使用MEDIUMINT时就不用BIGINT。
其次,要减少字段冗余。不过在创建冗余字段时,需要特别注意数据一致性问题。比如,为了减少关联查询,可以适当创建一些冗余字段,但必须通过合理的机制(如定时任务、数据更新触发等)来保证这些冗余字段的数据与源数据的一致性,避免出现数据不一致导致的业务逻辑错误。
另外,合理设置字段是否可为空(NULL)也很关键。尽量把字段设置为NOT NULL,这样在执行查询的时候,数据库不用去比较NULL值,能够减少不必要的判断操作,提升查询速度。例如,某些已知不会出现空值的字段,像用户表中的用户名(有注册规则保证必填)、身份证号码(有业务逻辑确保其必填)等字段,明确设置为NOT NULL能优化查询性能。
例如,在设计一个电商系统的商品表时,如果商品的品牌名称是相对固定且不会为空的信息,那就将其设置为NOT NULL,并且根据品牌名称的大致长度合理选择合适宽度的字段类型(如VARCHAR合适长度),避免过长的字段定义;若商品表中经常需要展示所属分类名称,而分类信息在其他地方已经有维护且更新频率不高,此时可以考虑在商品表中冗余一份分类名称字段,通过合理的更新机制保证数据一致性,这样在查询商品信息及展示相关页面时,就能减少关联查询操作,提高整体性能。
科学规划索引策略
索引在提高数据库查询速度方面起着举足轻重的作用,但如果使用不当,也可能带来性能损耗,所以需要科学合理地规划索引策略。
索引对于查询性能的提升效果显著,它类似于新华字典的偏旁部首检索,能够帮助数据库快速定位到需要的数据,避免全表扫描查询。在规划索引时,要依据查询需求、表结构等因素来添加必要的索引。例如,对于那些经常出现在WHERE子句、JOIN子句、ORDER BY或GROUP BY子句中的列,是比较适合创建索引的备选数据列。比如在一个订单表中,如果经常需要根据用户 ID 来查询某个用户的所有订单,那么在用户 ID 字段上创建索引,就能让这类查询操作的效率大大提高。
然而,要避免索引滥用。一方面,不要为选择性过低的字段建立索引。选择性过低意味着通过该字段只能过滤掉少部分的数据,即使没有索引直接查询数据表也不用过多遍历即可找到目标数据,这种情况下建立索引对查询效率的提升作用不大,反而会增加额外的磁盘空间占用以及在数据更新(如插入、更新、删除操作)时的开销,毕竟更新表时,MySQL 不仅要保存数据,还要维护索引文件。例如,一个逻辑删除字段(只有 0 未删除和 1 已删除两种值,且大部分数据都是未删除状态),若在组合索引中包含它,其实是没必要的,可以将其从组合索引中去掉。
另一方面,要注意复合索引的创建顺序。复合索引的匹配规则是从左往右匹配,无论是作为过滤条件还是排序条件都要遵循这个原则。假设在一个用户表的姓名(name)、工资(salary)和城市(city)数据列上建立了复合索引,索引中的数据行按照name/salary/city次序排列,那么即使在查询中只指定了name值,或者指定name和salary值,MySQL 也可以使用这个索引。所以在创建复合索引时,抛开业务本身需要,应尽量将选择性高的字段前置,这样相对而言 I/O 的次数可能会减少一些。比如,若city字段的选择性最高,salary次之,name最低,那么组合索引建立的顺序尽可能建为index(city, salary, name)。
同时,尽量使用覆盖索引。如果一个索引包含(或覆盖)所有需要查询的字段的值,那么就称为覆盖索引。使用覆盖索引查询时无需回表查询,能进一步提升查询效率。例如,有查询语句SELECT sum(col_c) FROM my_table WHERE col_a = 1 AND col_b = 1,若只建立了index(col_a, col_b)索引,而col_a和col_b过滤完后还有大量数据,那么 MySQL 需要通过大量回表去查询col_c的数据再去求和,这时建议建一个index(col_a, col_b, col_c)索引,以实现覆盖索引优化。
总之,科学规划索引策略需要综合考虑多方面因素,根据实际业务的查询特点和表结构情况,合理创建、使用索引,避免因不当使用索引而对数据库性能造成负面影响。
数据库运维层面的性能调优举措
保证数据内存读取
在 MySQL 性能调优中,让数据尽量从内存读取能极大地加快读取速度,最大限度减少磁盘操作,以下是一些相关的设置与方法。
首先是合理规划innodb_buffer_pool_size的大小。innodb_buffer_pool_size是 MySQL 中用于设置 InnoDB 缓冲池大小的参数,InnoDB 缓冲池是 InnoDB 存储引擎的主要内存缓存区,用于存放数据和索引的页面,它允许 MySQL 在内存中缓存频繁访问的数据,从而提高查询性能。可以在 MySQL 配置文件(如my.cnf或my.ini)的[mysqld]部分,添加或修改innodb_buffer_pool_size = <size>来设置其大小,其中<size>可以使用合适的单位,例如G表示 GB,M表示 MB。一般建议将innodb_buffer_pool_size设置为系统可用内存的 50% 到 70% 之间,不过具体的最佳值取决于系统配置、应用程序需求和数据规模等因素,要确保评估系统的内存使用情况和 MySQL 的负载特征,以便做出合理的设置。
例如,通过SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';命令查看相关状态信息,若发现Innodb_buffer_pool_pages_free为 0,则说明缓冲池已经被用光,需要增大innodb_buffer_pool_size。此外,还可以使用iostat -d -x -k 1命令查看硬盘的操作,或者执行echo 1 > /proc/sys/vm/drop_caches清除操作系统的文件缓存,以此来确定服务器上是否有足够内存用于规划该参数大小。
除了设置合适的缓冲池大小,数据预热也很关键。默认情况下,只有某条数据被读取一次,才会缓存在innodb_buffer_pool中,所以数据库刚刚启动时,需要进行数据预热,将磁盘上的所有数据缓存到内存中,这样可以提高后续的读取速度。对于 InnoDB 数据库,可按以下方法进行数据预热:
- 将以下脚本保存为MakeSelectQueriesToLoad.sql:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM
(
SELECT engine,table_schema db,table_name tb,index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM
(
SELECT B.engine,A.table_schema,A.table_name,A.index_name,A.column_name,A.seq_in_index
FROM information_schema.statistics A INNER JOIN
(
SELECT engine,table_schema,table_name
FROM information_schema.tables WHERE engine='InnoDB'
) B USING (table_schema,table_name)
WHERE B.table_schema NOT IN ('information_schema','mysql')
ORDER BY table_schema,table_name,index_name,seq_in_index
) A
GROUP BY table_schema,table_name,index_name
) AA
ORDER BY db,tb;
- 执行mysql -uroot -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql;
- 每次重启数据库,或者整库备份前需要预热的时候执行:mysql -uroot < /root/SelectQueriesToLoad.sql > /dev/null 2>&1。
同时,要注意不要让数据存到 SWAP 中,如果是专用 MYSQL 服务器,可以禁用 SWAP;如果是共享服务器,则要确定innodb_buffer_pool_size足够大,或者使用固定的内存空间做缓存,并使用memlock指令。
减少磁盘写入操作
减少磁盘写入操作能够有效降低磁盘操作频率,进而提升 MySQL 数据库的性能,以下是几种常用的方式。
一是设置合适的innodb_log_file_size。它相当于一个写入缓存,不过需要注意,如果设置过大,比如使用 1G 的innodb_log_file_size,当服务器出现故障停机时,可能需要较长时间(如 10 分钟)来恢复。通常推荐将innodb_log_file_size设置为0.25 * innodb_buffer_pool_size,这样能在一定程度上平衡性能与故障恢复的问题。
二是合理选择innodb_flush_log_at_trx_commit的值,这个选项和写磁盘操作密切相关。当innodb_flush_log_at_trx_commit = 1时,则每次修改都会立即写入磁盘,能保证数据的安全性,但磁盘操作较为频繁;而当innodb_flush_log_at_trx_commit = 0或2时,会每秒写入磁盘。如果应用对数据安全性要求不是特别高(比如非金融系统),或者基础架构足够安全,又或者事务都比较小的情况下,可以选择使用0或者2来降低磁盘操作频率,提升整体性能。
另外,还可以避免双写入缓冲,通过设置innodb_flush_method=O_DIRECT来实现,这有助于减少不必要的磁盘写入操作,优化磁盘使用效率。
定期优化重建数据库
定期对数据库进行优化重建是维持其高效运行状态的重要举措。随着数据库的使用,数据不断更新和变化,一些操作可能会导致数据库性能下降,例如mysqlcheck -o –all-databases命令执行后会让ibdata1文件不断增大,所以真正有效的优化往往需要重建数据表结构。
具体操作步骤如下:
- 使用CREATE TABLE mydb.mytablenew LIKE mydb.mytable;语句创建一个与原表结构相同的新表,这里以mydb数据库中的mytable表为例,创建出名为mytablenew的新表。
- 接着通过INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;语句将原表的数据插入到新表中。
- 然后执行ALTER TABLE mydb.mytable RENAME mydb.mytablezap;语句对原表进行重命名,这里重命名为mytablezap(可自行定义重命名后的名称),相当于备份原表。
- 再使用ALTER TABLE mydb.mytablenew RENAME mydb.mytable;语句将新表重命名为原表的名称,使其替代原表。
- 最后执行DROP TABLE mydb.mytablezap;语句删除之前重命名的原表备份(即mytablezap表),完成整个数据表结构的重建优化过程。
通过定期执行这样的操作,能有效整理数据库的数据和结构,避免因长期使用产生的数据碎片化等问题,让数据库保持良好的性能状态。
运用监控调优工具
MySQL 性能监控工具能够帮助我们及时发现并解决性能瓶颈,保持数据库的最佳状态。以下是一些常用的 MySQL 性能监控工具及其使用方法。
MySQL Enterprise Monitor:这是一款功能强大的商业监控工具,它可以全面监控 MySQL 服务器的各项性能指标,如查询执行时间、锁等待情况、系统资源使用情况等。使用时,首先需要进行安装配置,按照官方提供的安装向导完成相应设置后,登录其管理界面,就能直观地看到各种性能数据的展示图表与分析报告,依据这些监控数据,可以针对性地对数据库进行性能调优,例如发现某个查询语句执行时间过长,就可以进一步分析该查询的相关情况并优化。
Prometheus:它是一个流行的开源监控系统,对于 MySQL 的监控也有着出色的支持。使用 Prometheus 监控 MySQL 时,需要先在 MySQL 服务器上安装相应的 Exporter(如mysqld_exporter),用于收集 MySQL 的性能数据,然后配置 Prometheus 使其能够获取到这些由 Exporter 收集的数据,配置完成后,在 Prometheus 的 Web 界面中,就能看到诸如数据库连接数、查询次数、缓存命中率等各类性能指标的变化曲线,通过分析这些曲线走势以及具体数值,来判断数据库性能是否存在问题,并确定调优方向,比如发现缓存命中率持续偏低,就可以考虑调整缓存相关的配置参数。
MySQL 自带的监控命令与工具:
- SHOW命令:可以显示服务器的状态和变量信息,比如使用SHOW STATUS;能查看服务器当前的状态,像已处理的查询数量、连接数等信息;使用SHOW VARIABLES;则可查看服务器的各项配置变量情况;通过SHOW PROCESSLIST可以监视数据库中正在执行的查询和事务,了解数据库的负载情况,便于评估是否存在性能问题。
- EXPLAIN命令:常用于分析查询的执行计划,帮助我们了解查询的效率,比如执行EXPLAIN SELECT * FROM users WHERE age >30;这样的语句,就能看到查询语句在执行时如何利用索引、表之间的关联情况等信息,进而根据这些分析结果优化查询语句性能,比如发现没有正确使用索引导致全表扫描时,就可以针对性地调整索引或者查询条件。
另外,像Grafana这样的开源的数据可视化和监控平台,还可以与 Prometheus 等监控工具配合使用,通过配置数据源连接到 MySQL,创建仪表盘并添加面板来展示监控数据,将枯燥的数据以直观的图表形式呈现,更方便我们观察性能指标的变化趋势以及相互之间的关联,助力快速定位性能瓶颈所在,
相关文章:
MySQL 性能调优:打造高效数据库
SQL 语句层面的性能调优策略 合理选择字段属性 在创建 MySQL 表时,为了获取更好的性能,选择合适的字段属性至关重要。 首先,要依据实际情况合理设置字段的类型及宽度。例如,对于像手机号码这类固定长度为 11 位的字段ÿ…...
Elasticsearch 实战应用:提升数据洞察与交互体验
随着数据量的不断增长和数据处理需求的日益复杂,Elasticsearch 在实战应用中的价值愈发凸显。在本次教学中,我们继续深入探索 Elasticsearch 的更多高级实战应用,致力于培养学生在数据洞察和用户交互方面的卓越能力。 一、数据建模与优化策略…...
Ubuntu 配置静态 IP 地址
在 Ubuntu 系统中配置静态 IP 地址,适用于服务器或虚拟机需要固定 IP 的场景。以下是详细的步骤说明。 1. 确认网络接口信息 在配置之前,先确认系统的网络接口名称和当前的网络配置。 1.1 查看网络接口 运行以下命令获取网络接口的名称(如…...
2025美赛数学建模十大常用算法之层次分析法AHP详解
层次分析法(Analytic Hierarchy Process, AHP)详解 一、层次分析法简介 层次分析法(AHP)是一种系统化的多准则决策方法,由美国运筹学家萨蒂(Thomas L. Saaty)于20世纪70年代提出。AHP通过构建层…...
鸿蒙学习笔记:用户登录界面
文章目录 1. 提出任务2. 完成任务2.1 创建鸿蒙项目2.2 准备图片资源2.3 编写首页代码2.4 启动应用 3. 实战小结 1. 提出任务 本次任务聚焦于运用 ArkUI 打造用户登录界面。需呈现特定元素:一张图片增添视觉感,两个分别用于账号与密码的文本输入框&#…...
电脑上怎么运行手机APP(电脑上运行手机APP的4种方法)
玩家可能不愿意在小屏幕上使用 Android 应用程序。此外,某些游戏玩家可能更喜欢在更大的屏幕上寻找刺激的体验,例如 PC 提供的体验,这可以增强他们的乐趣。因此,他们可能对如何在 PC 上流畅地运行 Android 应用程序感到好奇。本指…...
Java原生实现代码沙箱的实现
代码沙箱实现 代码沙箱:只负责接收代码和输入,返回编译运行的结果,不负责判题(可作为独立项目/服务,提供给其他需要执行代码的项目使用) 以Java语言为主,实现代码沙箱。主要学习其思想、关键流…...
Docker基础命令实战
问题:Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp 199.59.148.9:443: connect: connection refused 在pull nginx时出现的报错,可能原因是镜像源过期了,我们需要更换镜像源 …...
【QT实战の心情笔记】
文章目录 界面布局主要界面分为三部分:1. 笔记列表区域2. 笔记内容编辑区域3. 操作按钮区域 Qt Designer 界面设计步骤完整界面布局图各控件设置和属性Qt Designer 文件 (.ui) 数据库表结构SQL 表结构: 逻辑代码1. 项目结构2. Note 类 (Note.h 和 Note.c…...
关于Unity VFX 在Spawn状态的一些笔记
一. periodic burst 和 single burst 的区别 1. Single Burst 定义:Single Burst 是一次性发射粒子,只在粒子系统启动时触发一次。 它是一个瞬时的发射行为,适合单次效果。 特性: 只触发一次。发射时间通常是粒子系统启动时。不会重复发射,除非重新触发粒子系统。适用场景…...
AutoMQ 流表一体新特性 Table Topic 发布: 无缝集成 AWS S3 Table 和 Iceberg
超越共享存储:使用 Apache Iceberg 中的 AutoMQ Table Topic 实现流处理与分析的统一 自 2023 年底官宣以来,AutoMQ 成功地将 Apache Kafka 从“Shared Nothing architecture”转变为“Shared Storage architecture”,这为京东、知乎、小红书…...
springboot445新冠物资管理(论文+源码)_kaic
摘 要 使用旧方法对新冠物资管理的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在新冠物资管理的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的新冠物资管…...
【AIGC】LangChain 环境搭建及模型API能力集成使用详解
目录 一、前言 二、LangChain 概述 2.1 LangChain 是什么 2.2 LangChain 主要特点 2.3 LangChain能做什么和能力一览 2.4 LangChain 主要应用场景 三、环境准备 3.1 python 开发环境 3.1.1 python环境 3.1.2 配置vscode环境 3.1.3 安装LangChain相关插件包 3.2 获取…...
YOLOv8目标检测(六)_封装API接口
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训…...
Firecrawl教程①:自动化抓取与数据转化,赋能AI应用
Firecrawl教程①:自动化抓取与数据转化,赋能AI应用 前言一、功能特点1. 支持 LLM 可处理的数据格式2. 全面抓取网站3. 强大的操作支持4. 灵活的定制选项5. 支持多种编程语言 SDK二、如何开始使用 Firecrawl第一步:获取 API 密钥第二步:官网在线工具使用第三步:安装 Firecr…...
2-2-18-17 QNX系统架构之“实时”
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...
Linux下部署MySQL8.0集群 - 主从复制(一主两从)
目录 一、部署前准备 1、查看系统信息 # 查看系统版本 cat /etc/red* # 查看系统位数 getconf LONG_BIT[rootlocalhost ~]# cat /etc/red* CentOS Linux release 7.5.1804 (Core) [rootlocalhost ~]# getconf LONG_BIT 642、下载对应安装包 进入MySQL官网:https:…...
将HTML转换为PDF:使用Spire.Doc的详细指南
目录 引言 1. 为什么选择 Spire.Doc? 1.1 主要特点 1.2 适用场景 2. 准备工作 2.1 引入 Spire.Doc 依赖 2.2 禁用 SSL 证书验证 3. 实现功能 3.1 主类结构 3.2 代码解析 4. 处理图像 5. 性能优化 5.1 异步下载图像 示例代码 5.2 批量处理优化 示例代…...
HarmonyOS 实践 - 设计模式在代码中的作用
文章目录 前言设计模式概述单例模式:全局状态管理代码分析 策略模式:界面主题切换代码分析 示例测试单例模式测试策略模式测试 体验评价总结 前言 在软件开发中,设计模式是公认的最佳实践,它能帮助开发者通过模块化和规范化的代码…...
kubeadm一键部署K8S 集群架构
kubeadm一键部署K8S 集群架构(centos7) https://www.k8src.cn/ https://kubernetes.io/zh-cn/docs/home/ https://blog.csdn.net/m0_58709145/article/details/140128179 https://blog.csdn.net/jiaqijiaqi666/article/details/129745828 Kubeadm init报错[ERROR CRI]: contai…...
[NSSCTF 2022 Spring Recruit]factor
给了: 说n是p*q 先求一下p*q factordb.com 然后再让pq 得到:31207540994438423298 接着用md5加密得到falg NSSCTF{7957a92ef959998115a6bda6d992656e}...
go 中使用redis 基础用法
1、安装redis 参考链接:https://www.codeleading.com/article/98554130215/ 1.1 查看是否有redis yum 源 yum install redis没有可用的软件包,执行1.2 1.2下载fedora的epel仓库 yum install epel-release --下载fedora的epel仓库1.3启动redis s…...
git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表
好的,git branch -r 这个命令用于列出远程分支。让我详细解释一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…...
回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 CNN-BiGRU,即卷积神经网络(CNN)与双…...
【人工智能数学基础】——深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用
深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用 贝叶斯理论(Bayesian Theory)是概率论和统计学中的一个重要分支,它以托马斯贝叶斯(Thomas Bayes)命名,主要关注如何根据新的证据更…...
Gin-vue-admin(1):环境配置和安装
目录 环境配置如果443网络连接问题,需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令,用于维护 go.mod 文件…...
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例 摘要 本文将详细探讨一种利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,并通过分析给定代码示例,揭示其工作原理和潜在风险。我们将重点讨论如何在靶机上实现调用计算器…...
Gargoyle路由安装dockerd
ea8500刷石像鬼路由1.14.0,安dockerd,需先下载并安装以下依赖包,逐个安装。 kernel_5.10.176-1-6b05bc664d80d655942a20fb9ef8c3cd_arm_cortex-a15_neon-vfpv4.ipk kmod-br-netfilter_5.10.176-1_arm_cortex-a15_neon-vfpv4.ipk kmod-crypto…...
在linux系统的docker中安装GitLab
一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …...
滑动窗口
滑动窗口 标志: 利用两个指针 只进不退的特性 (样子与窗口类似) 解题模板 更新结果的时机 应该具体题目具体分析。 例题: 438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 1658. 将 x 减到 0 的最小操作数 - 力…...
人工智能 AI 大模型研究设计与实践应用技术研究报告
人工智能 AI 大模型研究设计与实践应用技术研究报告 摘要: 本报告深入探讨了人工智能 AI 大模型的研究设计架构以及在各领域的实践应用技术。通过对模型架构、训练方法、优化策略的详细阐述,结合实际案例分析其在自然语言处理、计算机视觉、智能医疗等领…...
【深度学习】 零基础介绍卷积神经网络(CNN)
CNN学习 零基础介绍写个CNN最简单的代码一. 概述二. 搭建CNN1. 输入层2. 卷积层3. 激活层4. 池化层5. 全连接层6. 网络搭建小结7. 损失函数8. 梯度下降9. 反向传播10. 模型评估与正则化11. 尝试搭建自己的第一个CNN 三. 经典CNN结构四. 猫狗识别项目实践1. Paddle实现版本&…...
答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境
一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统,支持多种试题类型、多种试题难度、练题、考试、补考模式,提供全部前后台无加密源代码,支持私有化部署 二.测试环境 系统环境:CentOS、 运行环境&#x…...
PowerMILL 客制化宏 - 变量
从PowerMILL2012起,命令起始支持变量。支持变量将使宏命令更加灵活和功能强大。可以对变量做一些运算而不依赖其它语言。 当前支持有变量类型为: INT; REAL; STRING; ENTITY; ARRAY LIST; OBJECT; 以下就…...
第五篇:前后端如何“扯皮”——HTTP 在开发中的应用
文章目录 第五篇:前后端如何“扯皮”——HTTP 在开发中的应用1. HTTP 在前后端分离中的作用1.1 前后端分离的崛起1.2 HTTP 的职责 2. RESTful API 与 GraphQL 的对比2.1 RESTful API:标准化的老兵2.2 GraphQL:灵活的新秀2.3 RESTful 和 Graph…...
如何在 Ubuntu 22.04 服务器上安装 Jenkins
简介 Jenkins 是一个非常流行的免费自动化工具,每个人都应该了解它。DevOps 工程师使用它来自动化代码构建、测试和部署。本文将重点介绍如何在新的 Ubuntu LTS 版本,即 Ubuntu 22.04 中安装 Jenkins。 但在此之前,让我们快速讨论一下 Jenk…...
关于代码注释
代码注释的重要性与最佳实践 在软件开发过程中,代码注释被认为是代码质量的一个重要组成部分。它不仅帮助开发人员理解和维护代码,还有助于团队协作和代码的可持续性。然而,如何有效地使用注释是一个值得深思的问题。本文将探讨代码注释的重…...
Mitt 库使用笔记
1. 介绍 Mitt 是一个轻量级的 JavaScript 库,用于在应用程序中实现事件触发和监听。它不依赖任何外部库,功能简洁,主要用于在模块间进行事件传递。 体积小:Mitt 的压缩版本仅有几千字节,非常适合在前端框架中作为事件…...
OpenCVE:一款自动收集NVD、MITRE等多源知名漏洞库的开源工具,累计收录CVE 27万+
漏洞库在企业中扮演着至关重要的角色,不仅提升了企业的安全防护能力,还支持了安全决策、合规性要求的满足以及智能化管理的发展。前期博文《业界十大知名权威安全漏洞库介绍》介绍了主流漏洞库,今天给大家介绍一款集成了多款漏洞库的开源漏洞…...
uniapp中的uni-file-picker组件上传多张图片到服务器
由于在uniapp官方文档中的uni-file-picker组件可实现图片上传功能,默认的是上传到自带的服务,所以我们要修改成自己的服务器 1. 添加 :auto-upload"false" 加上这个取消自动上传 <uni-file-picker v-model"jobAddUpdateForm.imag…...
LIF神经元模型的显隐转换
本文星主将介绍LIF神经元模型的显式和隐式转换(星主看见有论文[1]是这个称呼的,所以本文也称显式和隐式),并得到隐式模型的解析解。注意:理解本文内容需要有一定的微积分基础,如果大家看着数学头疼…...
Node的学习以及学习通过Node书写接口并简单操作数据库
Node的学习 Node的基础上述是关于Node的一些基础,总结的还行; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹,并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…...
Android 获取屏幕物理尺寸
注:编译 sdk 需要使用 30 因为引入了 WindowMetrics、uild.VERSION_CODES.R 新 sdk 才存在的类和属性 某些场景处理 view ,对 view 显示的位置要求比较精确,通常我们使用context.getResources().getDisplayMetrics().widthPixels 获取到的宽、…...
【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )
文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…...
#渗透测试#红队全栈 powshell基础使用
声明! 学习视频来自B站up主 泷羽sec,任何违法事件与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!! 目录标题 认识powsehll打开方式 使用方式美化自己的powershell简单…...
Qt之自定义标题栏拓展(十)
Qt开发 系列文章 - user-defined-titlebars(十) 目录 前言 一、方式一 1.效果演示 2.创建标题栏类 3.可视化UI设计 4.定义相关函数 5.使用标题栏类 二、方式二 1.效果演示 2.创建标题栏类 3.定义相关函数 1.初始化函数 2.功能函数 3.窗口关…...
设计模式之创建型
1、What 关注对象的创建过程,旨在通过不同的方式来创建对象,以解耦对象的创建与其使用过程。这些模式提供了创建对象的灵活性和可扩展性,使得代码更加易于维护和管理。 1.1 单例模式 确保一个类只有一个实例,并提供一个全局访问…...
记录一下自己对网络安全法的笔记
仅记录一下自己对网络安全法的笔记 文章来源(https://www.cac.gov.cn/2016-11/07/c_1119867116_2.htm)(2016年11月7日第十二届全国人民代表大会常务委员会第二十四次会议通过)该法自2017年6月1日起施行。《网络安全法》是我国第一…...
Mybatis-plus-Join--分页查询
数据表四张: user: id,username,create_time,update_time product: id,name,price,number(库存),create_time,update_times order: id,quantity,order_time(下单时间),update_time order_detail:id,product_id,order_id,quant…...
EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 5
Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 5_Day9-Day10 (12.19-12.20)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Gui…...