架构设计:系统存储(9)——MySQL数据库性能优化(5)

云数据仓库的未来趋势:计算存储分离 简介:随着云时代的到来,数据库也开始拥抱云数据库时代,各类数据库系统在各内外云平台百花齐放,有开源的MySQL、PostgreSQL、MongoDB,传统数据库厂商的SQLServer、Oracle,云厂商自研的Aurora、Redshift、PolarDB、AnalyticDB、AzureSQL等。 作者 | 尚春 来源 | 阿里技术公众号 一 背景 随着云时代的到来,数据库也开始拥抱云数据库时代,各类数据库系统(OLTP、OLAP、NoSQL等)在各内外云平台(AWS、Azure、阿里云)百. 阅读详情

转自http://blog.youkuaiyun.com/yinwenjie/article/details/52757457

===================================
(接上文《架构设计:系统存储(9)——MySQL数据库性能优化(5)》)
4-3-3-3、避免死锁的建议

上一篇文章我们主要介绍了MySQL数据库中锁的基本原理、工作过程和产生死锁的原因。通过上一篇文章的介绍,可以确定我们需要业务系统中尽可能避免死锁的出现。这里为各位读者介绍一些在InnoDB引擎使用过程中减少死锁的建议。

*正确使用读操作语句

经过之前文章介绍,我们知道一般的快照读是不会给数据表任何锁的。那么这些快照读操作也就不涉及到参与任何锁等待的情况。那么对于类似insert…select这样需要做当前读操作的语句(但又不是必须进行当前读的操作),笔者的建议是尽可能避免使用它们,如果非要进行也最好放到数据库操作的非高峰期进行(例如晚间)。

*基于索引进行写操作,避免基于表扫描(聚集索引扫描)进行写操作

基于索引进行写操作的目的是保证一个写操作性质的事务中,被锁住的索引和需要请求的锁定资源被控制在最小范围内。而避免使用表锁的原因是保证一个写操作性质的事务中,不会额外锁住完全不需要的索引资源或者抢占完全不需要的索引资源。表锁虽然不会直接导致死锁,但是由于表锁的工作方式,导致它成为死锁原因的几率增大了。

*避免索引失效

使用索引一定要注意索引字段的类型,例如当字段是一个varchar类型,赋值却是一个int类型,就会导致索引失效。如下所示:

explain select * from myuser where user_name = 1
# user_name 字段的类型是varchar,该字段建立了一个非唯一键索引
# 但是以上语句在使用字段进行检索时,却使用了一个int作为条件值。
# 通过MySQL的执行计划可以看到,InnoDB引擎在执行查询时并未使用索引,而是走的全表扫描

+----+-------------+-------+------+---------------+-----+------+-------------+
| id | select_type | table | type | possible_keys | key | rows |    Extra    |
+----+-------------+-------+------+---------------+-----+------+-------------+
| 1  |   SIMPLE    | myuser|  ALL |  name_index   |     |  13  | Using where |
+----+-------------+-------+------+---------------+-----+------+-------------+
关键业务的delete、update语句应该使用执行计划进行审核:从MySQL version 5.6 版本开始,MySQL中的执行计划功能已经支持对delete、update语句进行执行过程分析了。如果需要执行比较复杂和相关操作或者关键业务的写操作,都应该首先在执行计划中观察其运行方式。后文我们马上开始执行计划的讲解。

5、SQL执行计划

为了帮助开发人员根据数据表中现有索引情况,了解自己编写的SQL的执行过程、优化SQL结构,MySQL提供了一套分析功能叫做SQL执行计划(explain)。下面我们就为大家介绍一下执行计划功能的使用。
5-1、执行计划基本使用
5-1-1、简单实例

首先我们给出几个执行计划的具体案例,这里使用的数据表还是上一篇文章中展示各种示例所使用的数据表。为了便于读者查看,这里再一次给出数据表的结构:

# 我们所示例的数据表和SQL语句均是工作在InnoDB数据库引擎下
# myuser数据表一共有4个字段,3个索引。
# user_name字段上创建了非唯一键非聚簇索引
# user_number字段上创建了唯一键非聚簇索引
# id字段上是聚簇索引
CREATE TABLE `myuser` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) NOT NULL DEFAULT '',
  `usersex` int(9) NOT NULL DEFAULT '0',
  `user_number` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  UNIQUE KEY `number_index` (`user_number`),
  KEY `name_index` (`user_name`)
)

您可以使用任何一种MySQL数据库客户端执行以下执行计划:

*不使用任何查询条件
explain select * from myuser;
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------+
| 1  |   SIMPLE    | myuser|  ALL |               |     |         |     |  13  |       |
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------+
# 检索数据表中的所有记录,由于没有使用任何检索条件,所以InnoDB引擎从聚簇索引上扫描出所有的数据行
使用非唯一建索引作为查询条件
explain select * from myuser where user_name = '用户1';

# 省去了表头,因为不好排版(可以参考上一个示例的表头)
......
|1 | SIMPLE | myuser | ref |name_index|name_index | 767 | const | 6 | Using index condition |

# InnoDB引擎首先从非聚簇索引上查找满足条件的多个索引项,然后在聚簇索引上找到具体的数据
直接使用主键作为查询条件
explain select * from myuser where id = 1;

# 省去了表头,因为不好排版(可以参考上上一个示例的表头)
......
|  1  |   SIMPLE   | myuser | const | PRIMARY | PRIMARY | 4 | const | 1 |  --这列没有信息--  |

#使用聚簇索引直接定位数据
使用非索引字段作为查询条件
explain select * from myuser where usersex = 1
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows |    Extra    |
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------------+
| 1  |   SIMPLE    | myuser|  ALL |               |     |         |     |  13  | Using where |
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------------+

# 由于没有创建索引,所以在聚簇索引上进行全表扫秒,并且过滤出满足条件的信息

5-1-2、执行计划结果项

虽然本文还没有针对以上执行计划示例的分析结果进行讲解,但是为了让各位读者能够无阻碍的看下去,本文需要首先说明一下执行计划中的各个结果项的基本含义。在以上的示例中我们使用的MySQL的版本为MySQL version 5.6,根据不同的数据库版本,执行计划的分析结果可能会有一些不同。

# 以下是MySQL 5.6版本的执行计划的分析结果的表头
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+-----+---------+-----+------+-------+

以上表头的各个字段项目的大致意义如下:

id:每个被独立执行的操作的标识,表示对象被操作的顺序;ID值大,先被执行;如果相同,执行顺序一般从上到下。

select_type: 数据库引擎将SQL拆分成若干部分的子查询/子操作,每个查询select子句中的查询类型(后文详细讲解)。

table: 本次子查询所查询的目标数据表。SQL查询语句即使再复杂,一次子查询也只可能最多关联一张数据表。

partitions: 本次查询所涉及的数据表目标分区信息(如果有分区的话)。后文将对分区的概念进行概要说明。

type: 子查询类型,非常重要的性能衡量点。这个字段项可能显示的值包括:“ALL->index->range->ref->eq_ref->const | system->NULL”这些值所表示的查询性能,从左至右依次增加(注意,按照数据库基本思想——B+树,查询性能可能呈几何级的变化也可能差异不大)。这些值所代表的查询动作,在后文中会详细进行介绍。

possible_keys: 本次子查询可能使用的索引(前提是,您要建立了索引)。如果查询所使用的检索条件可能涉及到多个索引,这里将会列出这些所有的可能性。

key: 本次子查询最终被选定的执行索引。有的时候possible_keys可能有值,但keys可能没有,这就代表InnoDB引擎最终并没有使用任何索引作为检所依据。

key_len: 被选定的索引键的长度。

ref: 表示本次子查询参照的参照条件/参照数据表,参照条件/参照数据表,这个字段的值还可能是一个常量。

rows: 执行根据目前数据表的实际情况预估的,完成这个子查询需要扫描的数据行数。

Extra:包含不适合在其他列中显示但十分重要的额外信息。这个字段所呈现的信息在后文也会进行详细说明。

5-1-3、MySQL数据库中的分区(partitions)

InnoDB引擎和MYISAM引擎都支持分区功能,只是不同的数据引擎实现细节不一样。分区功能是指将某一张数据表中的数据和索引按照一定的规则在磁盘上进行存储。分区功能只限于数据和索引的存储,是否对数据表进行了分区都不会影响索引在内存中的组织方式,并且分区功能的优势在数据量较小的情况下,是不怎么体现出来的。

这里写图片描述

目前主要的分区方式包括:按照某个字段的值范围进行分区(Range)、按照某一个或者多个字段的Hash Key进行分区(Hash)、按照某个字段的固定值进行分区(List)。并且开发人员还可以同时使用多种分区方式,对数据表进行复合分区。以下是一个分区的示例:

# 为partitionTable数据表建立四个存储分区
CREATE TABLE `partitionTable` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `FieldA` varchar(255) NOT NULL DEFAULT '',
  `FieldB` int(9) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`)
)
ENGINE=innodb  
PARTITION BY HASH(Id)
PARTITIONS 4;  

接着我们可以到MySQL的基础库中观察到partitionTable数据表的数据和索引计数结构:

# 查询partitiontable数据表的存储状态(库名为mysql)
# 为节约篇幅,省略了不相关的行和列
select * from innodb_table_stats where table_name like 'partitiontable%'
+---------------------+--------+----------------------+--------------------------+
|      table_name     | n_rows | clustered_index_size | sum_of_other_index_sizes |
+---------------------+--------+----------------------+--------------------------+
| partitiontable#p#p0 |   0    |           1          |            0             |
| partitiontable#p#p1 |   0    |           1          |            0             |
| partitiontable#p#p2 |   0    |           1          |            0             |
| partitiontable#p#p3 |   0    |           1          |            0             |
+---------------------+--------+----------------------+--------------------------+

# 从以上结果可以看出MySQL对于这个数据表的存储状态按照分区情况进行分别管理。

有一定数据量的情况下(至少应该超过100万),当数据按照某个字段进行分区存储,且这个字段(或者几个字段)并没有创建索引,那么查询操作的性能将会有明显提高,而且数据表的数据量越大性能提高越明显;如果这个字段(或者几个字段)创建了索引,则查询操作的性能提升并不明显——因为检索还是依靠索引结构。在执行计划的分析结果中有一个列,名字叫做partitions。该列的信息实际上是说明执行计划可能涉及的分区情况。
5-2、关键性能点

在我们根据SQL的执行计划进行查询语句和索引调整时,我们主要需要注意以下这些字段显示的值,以及它们背后所代表的性能表述。它们是:select_type列、type列、Extra列和key列。
5-2-1、select_type概要说明

一个复杂的SQL查询语句,在进行执行时会被拆分成若干个子查询。这些子查询根据存在的位置、执行先后顺序等要素被分解为不同的操作类型。当然还有的操作可能不涉及到任何实际数据表,例如两个子查询间的连接操作过程。在执行计划分析结果的select_type列,显示了拆分后这些子查询的类型,它们是:

SIMPLE(常见):简单的 SELECT查询。没有表UNION查询,没有子查询(嵌套查询)。我们在本节之前内容中给出的示例基本上属于这种查询类型,它基本上不需要也不能再进行子查询拆分。

PRIMARY(常见):由子查询(嵌套查询)的SQL语句下,最外层的Select 作为primary 查询。

DERIVED(常见):在from语句块中的子查询,属于衍生查询。例如以下的查询中接在“from”后面的子查询就属于这种类型的子查询:

explain select * from (select * from t_interfacemethod_param where name = 'uid') t_interfacemethod_param 

SUBQUERY 和 DEPENDENT SUBQUERY:这两种类型都表示第一个查询是子查询。区别是SUBQUERY表示的子查询不依赖于外部查询,而后者的子查询依赖于外部查询。

UNCACHEABLE SUBQUERY:子查询结果不能被缓存, 而且必须重写(分析)外部查询的每一行

UNION:从第二个或者在union 之后的select 作为 union 查询。这种查询类型出现在结果集与结果集的UNION操作中。

UNION RESULT:结果集是通过union 而来的。这种查询类型出现在结果集与结果集的UNION操作中。

DEPENDENT UNION:从第二个或者在union 之后的select 作为 union 查询, 依赖于外部查询。这种查询类型出现在结果集与结果集的UNION操作中。

UNCACHEABLE UNION:第二个 或者 在UNION 查询之后的select ,属于不可缓存的查询。这种查询类型出现在结果集与结果集的UNION操作中。

5-2-2、type概要说明

执行计划的type列中,主要说明了子查询的执行方式。它的值可能有如下的这些项目(根据MySQL数据库的执行引擎和版本还会有一些其它选项):

ALL:全表扫描,实际上是扫描数据表的聚簇索引,并在其上加锁还会视事务隔离情况加GAP间隙锁。在数据量非常少的情况下,做全表扫描和使用聚簇索引检索当然不会有太大的性能差异。但是数据量一旦增多情况就完全不一样了。

index:进行索引进行的扫描,它和ALL一样都是扫描,不同点是index类型的扫描只扫描索引信息,并不会对聚簇索引上对应的数据值进行任何形式的读取。例如基于主键的函数统计:

# 以下语句还是要进行全表扫描,但是它并不需要读取任何数据信息。
explain select count(*) from myuser

range:在索引(聚簇索引和非聚簇索引都有可能)的基础上进行检索某一个范围内满足条件的范围,而并不是指定的某一个或者某几个值,例如:

# 以下查询语句在聚簇索引上检索一个范围
explain select * from myuser where id >= 10

ref:在非聚簇索引的基础上使用“非唯一键索引”的方式进行查找。例如:

# 在myuser中已基于user_name字段建立了非聚簇索引,且并非唯一键索引
explain select count(*) from myuser where user_name = '用户1'

const | system:const可以理解为“固定值”查询,常见于使用主键作为“简单查询”的条件时。system是比较特殊的const,当这个数据表只有一行的情况下,出现system类型。例如以下查询的操作类型就是const:

# 直接使用主键值就可以在索引中进行定位,无论数据量多大,这个定位的性能都不会改变
explain select * from myuser where id = 1

5-2-3、Extra概要说明

执行计划分析结果中的Extra字段,包含了结果中其他字段中没有说明但是对性能分析有非常有帮助的信息。甚至有的时候可以但从这个字段分析出某个子查询是否需要调整、涉及到的索引是否需要调整或者MySQL服务的环境参数配置是否需要进行调整。Extra字段还可以看成是对特定子查询的总结。

Using index:使用了索引(无论是聚簇索引还是非聚簇索引)并且整个子查询都只是访问了索引信息,而没有访问真实的数据信息,那么在Extra字段就会出现这个描述。请看如下示例:

explain select user_name from myuser where user_name = '用户1';
+--------+-------------------------------------+
| ...... |                Extra                |
+--------+-------------------------------------+
| ...... |     Using where; Using index        |
+--------+-------------------------------------+

# 使用user_name字段进行查询,原本需要再从聚簇索引中查找数据信息
# 但是InnoDB引擎发现只需要输出一个字段,且这个字段就是user_name本身,甚至不需要去找全部数据了。

Using where 和 Using index condition:此where关键字并不是SQL查询语句中的where关键字(此where非彼where),而是指该子查询是否需要依据一定的条件对满足条件的索引(全表扫描也是扫描的聚簇索引)进行过滤。示例如下:

# user_number 是一个非聚簇唯一键索引,所以where条件后的user_number只会定位到唯一一条记录
# 不需要再根据这个条件查询是否还有其它满足条件的索引项了
explain select * from myuser where user_number = 77777
+--------+-------------+
| ...... |    Extra    |
+--------+-------------+
| ...... |             |
+--------+-------------+

# user_name 是一个非聚簇非唯一键索引,索引where条件后的user_name可能定位到多条记录
# 这时数据库引擎就会对这些索引进行检索,以便定位满足查询条件的若干索引项
#(由于B+树的结构,所以这些索引项是连续的)
explain select * from from myuser where user_name = '用户1'
+--------+------------------------------+
| ...... |              Extra           |
+--------+------------------------------+
| ...... |   Using index condition      |
+--------+------------------------------+

为什么以上示例中显示的是“Using index condition”而不是“Using where”呢?这是MySQL Version 5.6+ 的新功能特性,Index Condition Pushdown (ICP)。简单的说就是减少了查询执行时MySQL服务和下层数据引擎的交互次数,达到提高执行性能的目的。如果您关闭MySQL服务中的ICP功能(这个功能默认打开),以上示例的第二个执行语句就会显示“Using where”了。

Using temporary:Mysql中的数据引擎需要建立临时表进行中间结果的记录,才能完成查询操作。这个常见于查询语句中存在GROUP BY 或者 ORDER BY操作的情况。但并不是说主要子查询中出现了GROUP BY 或者 ORDER BY就会建立临时表,而如果Group By 或者 Order By所依据的字段(或多个字段)没有建立索引,则一定会出现“Using temporary”这样的提示。另一种常见情况发生在子查询join连接时,连接所依据的一个字段(或多个字段)没有建立物理外键和索引。一旦在Extra字段中出现了“Using temporary”提示,一般来说这条子查询就需要重点优化。

Using filesort:Mysql服务无法直接使用索引完成排序时,就需要动用一个内存空间甚至需要磁盘交换动作辅助才能完成排序操作。这句话有两层含义,如果排序所依据的字段(一个或者多个)并没有创建索引,那么肯定无法基于索引完成排序;即使排序过程能够依据正确的索引完成,但是由于涉及到的查询结果太多,导致用于排序的内存空间不足,所以MySQL服务在进行排序时还会有磁盘交换动作。负责配置某一个客户(session)可用的内存空间参数项名字为“sort_buffer_size”。默认的大小为256KB,如果读者对查询结果集有特别要求,可以将该值改为1MB。一旦在Extra字段中出现了“Using filesort”提示,那么说明这条子查询也需要进行优化。

explain select * from myuser order by usersex
+--------+-----------------------+
| ...... |          Extra        |
+--------+-----------------------+
| ...... |   Using filesort      |
+--------+-----------------------+

# 由于usersex并没有创建索引,所以使用filesort策略进行排序。

注意,在子查询中为Group By和Order by操作创建索引时,有时需要联合where关键字使用的查询字段一起创建复合索引才能起作用。这是因为子查询为了检索,所首先选择一个可用的索引项,随后进行排序时,却发现无法按照之前的索引进行排序,所以只有走filesort了。例如以下示例:

# user_name字段和user_number字段都独立创建了索引
explain select * from myuser where user_name = '用户1' group by user_number
+--------+------------+----------------------------------------------------------+
| ...... |    key     |                             Extra                        |
+--------+------------+----------------------------------------------------------+
| ...... | name_index |  Using index condition; Using where; Using filesort      |
+--------+------------+----------------------------------------------------------+

# 为了首先完成条件检索,InnoDB引擎选择了user_name字段的索引
# 但是排序时发现无法按照之前的索引字段完成,所以选择走filesort

Using join buffer:使用InnoDB引擎预留的join buffer区域(一个专门用来做表连接的内存区域),这是一个正常现象主要涉及到两个子查询通过join关键字进行连接的操作。每一个客户端连接(session)独立使用的join buffer区域大小可以通过join_buffer_size参数进行设置。这个参数在MySQL 5.6 Version中的默认值为128KB。如果开发人员经常需要用到join操作,可以适当增加区域大小到1MB或者2MB。

# 以下语句是一个左外连接的操作
# 并且t_interfacemethod.uid和t_interfacemethod_param.interfacemethod之间有外键和索引存在
explain select * from  t_interfacemethod_param 
left join  t_interfacemethod on t_interfacemethod.uid = t_interfacemethod_param.interfacemethod

+--------+----------------------------------------------------------+
| ...... |                          Extra                           |
+--------+----------------------------------------------------------+
| ...... |                                                          |
+--------+----------------------------------------------------------+
| ...... |  Using where; Using join buffer (Block Nested Loop)      |
+--------+----------------------------------------------------------+

5-3、执行计划的局限性

执行计划不考虑Query Cache : 执行计划只考虑单次语句的执行效果,但实际上MySQL服务以及上层业务系统一般都会有一些缓存机制,例如MySQL服务中提供的Query Cache功能。所以实际上可能查询语句的重复执行速度会快一些。

执行计划不能分析insert语句:insert语句的执行效果实际上是和其他语句相互作用的,所以执行计划不能单独分析insert语句的执行效果。不过update和delete语句都是可以分析的(请使用MySQL Version 5.6+ 版本)。

执行计划不考虑可能涉及的存储过程、函数、触发器带来的额外性能消耗。

总的来说经过各个MySQL版本对执行计划功能的优化,现在这个功能得到的分析结果已经非常接近真实执行效果了。但是MySQL执行性能最关键的依据还是各位技术人员的数据库设计能力,起飞吧程序猿!
6、更高效的InnoDB引擎

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL。Google早已将他们服务器运行的上万个MySQL服务替换成了MariaDB,从公开的资料看淘宝技术部门也掀起一股使用MariaDB替换MySQL的技术思潮。

这里写图片描述

MariaDB数据库的产生和发展和甲骨文公司收购MySQL事件有关,它是MySQL之父Widenius先生重新主导开发的完全和MySQL兼容的产品,其下运行的核心引擎还是InnoDB(这个版本的InnoDB引擎,也被称为XtraDB )。各位读者所在的技术团队也不妨尝试一下,因为这两中数据库的使用从业务层开发人员来看完全没有任何区别,DBA的维护手册甚至都不需要做任何更改。

================================
后记:MySQL数据库性能优化 部分的文章本来只计划了三篇,但是这一动笔完全就是一发不可收拾。到这里先告一段落吧,不然会严重影响后续知识内容的写作。从下篇文章开始,我们将一起讨论一下MySQL数据库的备份和集群方案。

MySQL 5.1与Navicat 9.0:数据库管理与开发的黄金组合 MySQL 5.1作为一个经典的版本,在数据库管理系统中占据重要地位,它不仅拥有稳定的性能,而且在安全性、扩展性上也有显著提高。本章将带您快速了解MySQL 5.1的核心特性,以及这些特性如何适应日益复杂的数据库需求。MySQL 5.1对之前版本进行了多个方面的改进,添加了如分区、事件调度器、存储过程和触发器等高级特性,使得数据库操作更加灵活高效。这些新特性不仅满足了企业级应用的需求,还为开发人员提供了更丰富的开发工具。 阅读详情

相关推荐

PyCharm配置WSL开发环境保姆级教程:从安装Conda到项目依赖一键搞定

本文提供PyCharm配置WSL开发环境的完整教程,涵盖从安装Conda到项目依赖管理的全流程。详细介绍了WSL2环境准备、Conda环境配置、PyCharm远程解释器设置等关键步骤,并包含实用技巧和常见问题解决方案,帮助开发者高效搭建Python开发环境。

weixin_42620202的博客 307

一文带你了解SQL的执行计划(explain)

为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息。通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?)一个表中可能存在多个表中不同的索引,表中的类型是什么是否子查询、关联查询等…sql学习来自于sqlercn讲师了解SQL如何访问表中的数据了解SQL如何使用表中的索引了解SQL所使用的查询类型。...

黎明强的博客 2万+

【STK】手把手教你利用STK进行导弹和反导仿真02 - STK/MMT模块01 导弹任务分析工具概述

种工具:导弹设计工具(Missile Design Tool,MDT )、导弹飞行工具(Missile Flight Tool,截弹,或者用内置拦截弹编辑器创建的个性化的拦截弹, IFT 能够对 ―一对一 ‖动能拦截。导设置系统参数, 并对其有效性进行验证, 画性能图,保证该设计是可行的。(SAIC)公司联合开发研制,极大扩展了 STK 原有的导弹对象的功能,能够精确仿真。IFT 能够对拦截飞机、 导弹、卫星等目标进行仿真和分析。(2)推进系统参数,包括推力,比冲,秒流量,推力持续时间,喷嘴出口面积,

weixin_44184852的博客 1876

SQL语句的执行计划

结合具体案例,来讲解SQL执行计划

weixin_35794878的博客 4808

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

|~~~热爱生活、努力学习的小伙汁~~~| 2107

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口Java

本篇教程的Java程序中开始使用PostgreSQL之前,需要确保在计算机上设置了PostgreSQL JDBC和Java。您可以检查Java教程以在计算机上安装Java。现在让本篇教程检查如何设置PostgreSQL JDBC驱动程序。

No8g攻城狮的博客 1753

SQL优化——执行计划

获取执行计划的常用方法、定制执行计划、通过查看执行计划建立索引、通过光标移动阅读执行计划

码说芯语的博客 6241

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1597

SQL执行计划

SQL执行计划一、执行计划是什么执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤。执行计划可以让你知道复杂的sql语句是怎么执行的,有没有按照你想的方案执行,有没有按照最高效的方式执行,使用了众多索引的哪一个,通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接...

weixin_40310432的博客 2962

self‑improving‑agent 安装与配置指南(OpenClaw)

长期记忆错误反思用户偏好学习持续进化AI → 反思 → 学习 → 改进。

tiantiantbtb的博客 1337

ARM 之十六 详解 CMSIS 版本变迁、各组件使用示例

目前,CMSIS 已经发展到了第六版,其目录结构也发生了重大的变化。在不断发展中,很多原来 CMSIS 的组件被不断独立出去,并因此成立了很多开源社区,今天就来学习一下!由于 CMSIS 已经包含了相当丰富的文档,因此,本文重点学习版本之间的变化以及一些实际使用示例。

技术干货 1954

SQL Server的执行计划(Execution Plans)

为了能够执行查询,SQL Server 数据库引擎必须分析该语句,以确定访问所需数据的最有效方法。此分析由称为查询优化器的组件处理。查询优化器的输入由查询、数据库架构(表和索引定义)和数据库统计信息组成。查询优化器的输出是查询执行计划,有时称为查询计划或执行计划。

Lion_Long的博客 5446

git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案

本文主要介绍了git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案,希望能对使用git的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 23万+

架构设计:系统存储(5)——MySQL数据库性能优化(1)

从本文开始我们将讨论建立在块存储方案之上的关系型数据库的性能优化方案和集群方案。关系型数据库的选型将以创业公司、互联网行业使用最广泛的MySQL数据为目标,但是MySQL的安装过程和基本使用方法等知识并不在我们讨论的范围内。后续几篇文章我们首先讨论影响单个MySQL节点性能的主要因素,然后介绍MySQL读写分离、数据表横纵拆分的原理和技术方案。MySQL数据库目前已被Oracle收购,并发展处多个版本。

smart_an的专栏 1388

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MySQL性能优化的9种方法

MySQL性能优化的9种方法 1、选择最合适的字段属性 Mysql是一种关系型数据库,可以很好地支持大数据量的存储,但是一般来说,数据库中的表越小,在它上面执行的查询也就越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度舍得尽可能小。 例如:在定义邮政编码这个字段时,如果将其设置为char(255),显然给数据库增加了不必要的空间,甚至使用varchar这种类型也是多余的,因为char(6)就可以很好地完成了任务。同样的如果可以的话,我们应该是用MEDIUMINT而不是BIGINT来定

csdnlaiyanqi的博客 4万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MySQL 9从入门到性能优化-权限表

user表中的权限是针对所有数据库的,如果希望用户只对某个数据库有操作权限,那么需要将user表中对应的权限设置为N,然后在db表中设置对应数据库的操作权限。这时,可以将用户名称Zhangting添加到db表中,而db表中的host字段值为空,然后将两个主机地址分别作为两条记录的host字段值添加到host表中,并将两张表的数据库字段设置为相同的值books。db表的用户列有3个字段,分别是Host、User、Db,标识从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。

夏天又到了的专栏 1258

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据仓库之分层存储

数据仓库的分层存储是一种优化数据存储和访问性能的方法,通过将数据根据其使用频率和重要性进行分层,以便在不同层次上采用不同的存储技术和策略。这种方法不仅能够提升查询性能,还能有效控制存储成本。

youziguo的专栏 2581

新书速览|MySQL 9从入门到性能优化:视频教学版

主要内容包括MySQL的安装与配置,数据库和数据表基本操作,数据类型和运算符,MySQL函数,查询数据,插入、更新与删除数据,索引的设计和使用,存储过程和函数,视图,MySQL触发器,数据备份与恢复,MySQL日志,MySQL权限与安全管理,SQL性能优化,MySQL服务器性能优化,MySQL性能监控,提升MySQL数据库的性能,MySQL终极优化实战,企业人事管理系统数据库设计,在线购物系统数据库设计。4.3.12 获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len) 91。

quanzhankaifaqua的博客 1547

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》

MySQL是流行的关系数据库管理系统之一,由于其体积小、速度快、总体拥有成本低、开放源码等特点,一般中小型企业甚至大型互联网企业的应用开发都选择MySQL作为数据库。本书注重实战操作,详解MySQL 9数据库的操作、运维、优化和设计方法,配套示例源码、PPT课件、同步教学视频、作者微信群答疑服务,帮助读者快速掌握MySQL数据库。

夏天又到了的专栏 2475

Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解

在数据驱动的互联网时代,数据存储技术是构建应用系统的基石。文件存储(如TXT/CSV)适合简单场景,但面临并发性差、查询效率低等问题。‌MySQL作为关系型数据库的典型代表‌,凭借其开源、高性能、事务支持等特性,成为Web应用、数据分析等领域的主流存储方案。

优快云博客专家,领域包括但不限于:AI、大数据、Python、架构师,有合作、课程、问题、疑惑请私信博主 2874

Chat2DB多数据库支持深度剖析:从MySQL到MongoDB的无缝连接

在当今数据驱动的时代,企业往往需要同时管理多种类型的数据库系统。从传统的关系型数据库MySQL、PostgreSQL,到NoSQL数据库MongoDB、Redis,再到新兴的时序数据库ClickHouse、分布式数据库OceanBase,数据库生态呈现多元化发展趋势。 **痛点场景**:开发人员需要在不同数据库客户端之间频繁切换,SQL语法差异导致学习成本高昂,数据迁移和同步成为技术瓶颈。Cha...

gitblog_00114的博客 1131

MySQL 实战指南:从基础操作到性能优化

MySQL 凭借其强大的功能和灵活的特性,成为众多开发者和企业的首选数据库。在实际应用中,还需根据具体业务需求和数据特点,不断探索和实践,以发挥 MySQL 的最大价值。事务是一组操作的集合,要么全部成功执行,要么全部回滚,以保证数据的一致性和完整性。良好的数据库设计是性能优化的基础。存储过程是一组预编译的 SQL 语句,可在数据库中存储并重复调用,提高代码的复用性和执行效率。但索引并非越多越好,过多的索引会增加数据插入、更新和删除的开销,因此需要根据实际查询需求进行优化。一、MySQL 基础操作​。

XDLYSJ的博客 1493
上一篇: 架构设计:系统存储(8)——MySQL数据库性能优化(4)
下一篇: 架构设计:系统存储(10)——MySQL简单主从方案及暴露的问题
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值