mysql使用expain查看sql语句执行

本文详细介绍了MySQL中的EXPLAIN命令,它提供了查询执行计划的详细信息,包括表名、访问类型、索引使用等,有助于性能优化和索引选择。

当使用EXPLAIN命令来查看SQLEXPLAIN是一个在MySQL中用于分析查询性能的关键命令。通过在SQL查询语句前加上EXPLAIN关键字,可以获取有关查询执行计划的详细信息,包括MySQL将如何执行查询以及使用哪些索引等重要信息。

执行EXPLAIN命令后,MySQL会返回一组行,每一行都包含了关于查询执行的重要信息。这些信息包括了查询中涉及的表、使用的索引、访问类型、扫描的行数等等。通过分析这些信息,可以更好地理解查询的执行方式,找到可能存在的性能瓶颈,并且优化查询语句以提高性能。

所有的值

使用EXPLAIN命令可以帮助开发人员和数据库管理员更好地理解查询的执行过程,优化查询语句,选择合适的索引以及表设计,从而提升数据库系统的性能和效率。语句的执行计划时,可以使以下是一个示例表格:

作用取值范围
id查询标识符1表示查询中的第一个SELECT子句,2表示第二个,以此类推
select_type查询类型SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION, UNION RESULT等
table表名查询涉及的表名
partitions使用的分区使用的分区
type访问类型system, const, eq_ref, ref, range, index, all等
possible_keys可能使用的索引可能使用的索引
key实际使用的索引实际使用的索引
key_len索引长度索引的长度
ref列与索引的比较列与索引的比较条件
rows扫描的行数估计需要扫描的行数
filtered结果集过滤后的行数百分比结果集过滤后的行数百分比
Extra额外信息使用了临时表、文件排序、使用了索引提示等信息

以上是一个简单的Markdown表格,用于展示EXPLAIN命令返回的各个值的作用以及取值范围。这样的表格可以更清晰地展示每个值的含义和可能的取值,方便用户理解查询执行计划。

需要关注的值

当使用EXPLAIN命令查看SQL语句的执行计划时,通常需要关注以下几个重要的值:

  1. select_type:查询类型,指示查询的类型,如SIMPLE、PRIMARY、SUBQUERY等,帮助了解查询的复杂度和优化方式。

  2. table:表名,显示查询涉及的表,帮助了解查询中涉及哪些表。

  3. type:访问类型,表示MySQL在表中找到所需行的方式,例如使用索引还是全表扫描。

  4. key:实际使用的索引,显示实际使用的索引,帮助了解查询是否充分利用了索引。

  5. rows:扫描的行数,表示MySQL估计需要扫描的行数,帮助了解查询的效率和性能。

  6. Extra:额外信息,显示一些额外的信息,如使用了临时表、文件排序等,有助于了解查询执行过程中的其他相关信息。

这些值可以帮助用户理解查询的执行计划,优化查询性能以及索引的使用情况。

void default_val(void) { uint16_t *addp; uint16_t temp, i; addp = (uint16_t *)(&(mainsConfigureStd[2])); Spi_write_uint16_t(addp, MAINS_CONFIGURE_ADD, sizeof(mainsConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(stateDelayConfigureStd[2])); Spi_write_uint16_t(addp, STATE_DELAY_CONFIGURE_ADD, sizeof(stateDelayConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(genConfigureStd[2])); Spi_write_uint16_t(addp, GEN_CONFIGURE_ADD, sizeof(genConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(loadConfigureStd[2])); Spi_write_uint16_t(addp, LOAD_CONFIGURE_ADD, sizeof(loadConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(atsConfigureStd[2])); Spi_write_uint16_t(addp, ATS_CONFIGURE_ADD, sizeof(atsConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(engineConfigureStd[2])); Spi_write_uint16_t(addp, ENGINE_CONFIGURE_ADD, sizeof(engineConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(moduleConfigureStd[2])); Spi_write_uint16_t(addp, MODEL_CONFIGURE_ADD, sizeof(moduleConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); Get_Mac(); addp = (uint16_t *)(&(moduleConfigure.mac[0])); Spi_write_uint16_t(addp, MODEL_CONFIGURE_ADD + offsetof(moduleConfigureStruct, mac[0]), 6); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(maintainConfigureStd[2])); Spi_write_uint16_t(addp, MAINTAIN_CONFIGURE_ADD, sizeof(maintainConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(sensorConfigureStd[2])); Spi_write_uint16_t(addp, SENSOR_CONFIGURE_ADD, sizeof(sensorConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(inputConfigureStd[2])); Spi_write_uint16_t(addp, INPUT_CONFIGURE_ADD, sizeof(inputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(outputConfigureStd[2])); Spi_write_uint16_t(addp, OUTPUT_CONFIGURE_ADD, sizeof(outputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(selectConfigureStd[2])); Spi_write_uint16_t(addp, ALT_CONFIG_CONFIGURE_ADD1, sizeof(selectConfigStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(selectConfigureStd[2])); Spi_write_uint16_t(addp, ALT_CONFIG_CONFIGURE_ADD2, sizeof(selectConfigStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(selectConfigureStd[2])); Spi_write_uint16_t(addp, ALT_CONFIG_CONFIGURE_ADD3, sizeof(selectConfigStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(syncConfigureStd[2])); Spi_write_uint16_t(addp, SYNC_CONFIGURE_ADD, sizeof(syncConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expOutputConfigureStd[2])); Spi_write_uint16_t(addp, EXP_OUTPUT_CONFIGURE_ADD, sizeof(expOutputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); //2023.4.27 addp = (uint16_t *)(&(customDataConfigureStd[0])); Spi_write_uint16_t(addp, CUSTOM_CONFIGURE_ADD, 600); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expInputConfigureStd[2])); Spi_write_uint16_t(addp, EXP_INPUT_CONFIGURE_ADD, sizeof(expInputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expAinConfigureStd[2])); Spi_write_uint16_t(addp, EXP_AIN_CONFIGURE_ADD, sizeof(expAinConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expAin8ConfigureStd[2])); Spi_write_uint16_t(addp, EXP_AIN8_CONFIGURE_ADD, sizeof(expAin8ConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(GWConfigureStd)); Spi_write_uint16_t(addp, GW_CONFIGURE_ADD, sizeof(GWConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); HAL_IWDG_Refresh(&hiwdg); /**************************读eepom*******************************/ HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(mainsConfigure)); Spi_read_uint16_t(addp, MAINS_CONFIGURE_ADD, sizeof(mainsConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(stateDelayConfigure)); Spi_read_uint16_t(addp, STATE_DELAY_CONFIGURE_ADD, sizeof(stateDelayConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(genConfigure)); Spi_read_uint16_t(addp, GEN_CONFIGURE_ADD, sizeof(genConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(loadConfigure)); Spi_read_uint16_t(addp, LOAD_CONFIGURE_ADD, sizeof(loadConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(atsConfigure)); Spi_read_uint16_t(addp, ATS_CONFIGURE_ADD, sizeof(atsConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(engineConfigure)); Spi_read_uint16_t(addp, ENGINE_CONFIGURE_ADD, sizeof(engineConfigure) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(moduleConfigure)); Spi_read_uint16_t(addp, MODEL_CONFIGURE_ADD, sizeof(moduleConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(maintainConfigure)); Spi_read_uint16_t(addp, MAINTAIN_CONFIGURE_ADD, sizeof(maintainConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(sensorConfigure)); Spi_read_uint16_t(addp, SENSOR_CONFIGURE_ADD, sizeof(sensorConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(inputConfigure)); Spi_read_uint16_t(addp, INPUT_CONFIGURE_ADD, sizeof(inputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(outputConfigure)); Spi_read_uint16_t(addp, OUTPUT_CONFIGURE_ADD, sizeof(outputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(selectConfig1)); Spi_read_uint16_t(addp, ALT_CONFIG_CONFIGURE_ADD1, sizeof(selectConfigStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(selectConfig2)); Spi_read_uint16_t(addp, ALT_CONFIG_CONFIGURE_ADD2, sizeof(selectConfigStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(selectConfig3)); Spi_read_uint16_t(addp, ALT_CONFIG_CONFIGURE_ADD3, sizeof(selectConfigStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(syncConfigure)); Spi_read_uint16_t(addp, SYNC_CONFIGURE_ADD, sizeof(syncConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expOutputConfigure)); Spi_read_uint16_t(addp, EXP_OUTPUT_CONFIGURE_ADD, sizeof(expOutputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); //2023.4.27 addp = (uint16_t *)(&(customDataConfigure[0])); Spi_read_uint16_t(addp, CUSTOM_CONFIGURE_ADD, 600); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expInputConfigure)); Spi_read_uint16_t(addp, EXP_INPUT_CONFIGURE_ADD, sizeof(expInputConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expAinConfigure)); Spi_read_uint16_t(addp, EXP_AIN_CONFIGURE_ADD, sizeof(expAinConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(expAin8Configure)); Spi_read_uint16_t(addp, EXP_AIN8_CONFIGURE_ADD, sizeof(expAin8ConfigureStruct) / 2); HAL_Delay(2); //osDelay(5); addp = (uint16_t *)(&(GWConfigure)); Spi_read_uint16_t(addp, GW_CONFIGURE_ADD, sizeof(GWConfigureStruct) / 2); temp = 0x4240; for (i = 0; i < 10; i++) { Spi_write_uint16_t(&temp, MASK_SPN_ADD + 4 * i, 1); HAL_Delay(2); //osDelay(5); } temp = 0x0F; for (i = 0; i < 10; i++) { Spi_write_uint16_t(&temp, MASK_SPN_ADD + 4 * i + 2, 1); HAL_Delay(2); //osDelay(5); } for (i = 0; i < 10; i++) { maskSPN[i] = 1000000ul; } spnCmVersion = 0; Spi_write_uint16_t(&spnCmVersion, MASK_SPN_ADD + 40, 1); HAL_Delay(2); //osDelay(5); HAL_IWDG_Refresh(&hiwdg); temp = sizeof(UNICODE) / 2; Spi_write_uint16_t(&temp, PC_USED_ADD, 1); HAL_Delay(2); //osDelay(5); temp = 0; Spi_write_uint16_t(&temp, PC_USED_ADD + 2, 1); HAL_Delay(2); //osDelay(5); temp = 0; Spi_write_uint16_t(&temp, PC_USED_ADD + 4, 1); HAL_Delay(2); //osDelay(5); temp = 0; Spi_write_uint16_t(&temp, PC_USED_ADD + 6, 1); HAL_Delay(2); //osDelay(5); Spi_write_uint16_t(&temp, TEST_GEN_ADD, 1); HAL_Delay(2); //osDelay(5); Spi_write_uint16_t(&temp, TEST_GEN_ADD + 2, 1); HAL_Delay(2); //osDelay(5); Spi_write_uint16_t(&temp, TEST_GEN_ADD + 4, 1); HAL_Delay(2); //osDelay(5); DATA_REGISTER.runHourResultA = 0; DATA_REGISTER.runMinuteResultA = 0; DATA_REGISTER.runSecondResultA = 0; DATA_REGISTER.numStartResultA = 0; DATA_REGISTER.runGenKwhA = 0; DATA_REGISTER.runHourResultB = 0; DATA_REGISTER.runMinuteResultB = 0; DATA_REGISTER.runSecondResultB = 0; DATA_REGISTER.numStartResultB = 0; DATA_REGISTER.runGenKwhB = 0; kwhPTempA = 0; kwhPTempB = 0; Spi_write_uint16_t((uint16_t *)(&DATA_REGISTER.runHourResultA), TOTAL_RUN_HOUR_ADD_USER, 12); HAL_Delay(2); //osDelay(5); }描述功能
最新发布
09-11
该函数 `default_val()` 的功能是:**初始化系统配置参数并将其写入外部非易失性存储器(如SPI Flash或EEPROM),同时从存储器中读取这些配置加载到运行时变量中,确保系统使用的是最新的默认配置。** --- ### 函数原型: ```c void default_val(void) ``` 该函数没有参数,主要用于系统首次上电、恢复出厂设置或配置重置时,将预设的默认配置写入外部存储器,并从存储器中读回这些配置供系统使用。 --- ### 功能详解: #### 1. **配置结构体写入逻辑** ```c addp = (uint16_t *)(&(mainsConfigureStd[2])); Spi_write_uint16_t(addp, MAINS_CONFIGURE_ADD, sizeof(mainsConfigureStruct) / 2); HAL_Delay(2); ``` - 将结构体数组 `mainsConfigureStd` 的地址转换为 `uint16_t*`; - 使用 `Spi_write_uint16_t()` 按16位整型写入; - 写入地址为宏定义 `MAINS_CONFIGURE_ADD`; - `sizeof(...) / 2` 表示结构体大小转换为16位字数量; - 每次写入后延时2ms,确保写入完成。 #### 2. **支持的配置结构体包括:** | 结构体名 | 作用 | |-----------------------------|------| | `mainsConfigureStruct` | 主电配置 | | `stateDelayConfigureStruct` | 状态延时配置 | | `genConfigureStruct` | 发电机配置 | | `loadConfigureStruct` | 负载配置 | | `atsConfigureStruct` | ATS(自动转换开关)配置 | | `engineConfigureStruct` | 发动机配置 | | `moduleConfigureStruct` | 模块配置(含MAC地址) | | `maintainConfigureStruct` | 维护配置 | | `sensorConfigureStruct` | 传感器配置 | | `inputConfigureStruct` | 输入配置 | | `outputConfigureStruct` | 输出配置 | | `selectConfigStruct` | 选择配置(可写入3份) | | `syncConfigureStruct` | 同步配置 | | `expOutputConfigureStruct` | 扩展输出配置 | | `expInputConfigureStruct` | 扩展输入配置 | | `expAinConfigureStruct` | 扩展模拟输入配置 | | `expAin8ConfigureStruct` | 扩展8通道模拟输入配置 | | `GWConfigureStruct` | 网关配置 | | `customDataConfigure` | 自定义数据配置(600个16位字) | #### 3. **MAC地址单独写入** ```c Get_Mac(); addp = (uint16_t *)(&(moduleConfigure.mac[0])); Spi_write_uint16_t(addp, MODEL_CONFIGURE_ADD + offsetof(moduleConfigureStruct, mac[0]), 6); ``` - 先调用 `Get_Mac()` 获取MAC地址; - 再将MAC地址部分写入到 `moduleConfigureStruct` 中的指定偏移地址; - 写入6个16位字(共12字节),即MAC地址长度。 #### 4. **配置结构体读取逻辑** ```c addp = (uint16_t *)(&(mainsConfigure)); Spi_read_uint16_t(addp, MAINS_CONFIGURE_ADD, sizeof(mainsConfigureStruct) / 2); ``` - 将结构体变量 `mainsConfigure` 的地址转换为 `uint16_t*`; - 使用 `Spi_read_uint16_t()` 按16位整型读取; - 从地址 `MAINS_CONFIGURE_ADD` 中读取配置数据; - 用于将写入的默认配置重新加载到运行时变量中。 #### 5. **特殊初始化数据写入** ```c temp = 0x4240; for (i = 0; i < 10; i++) { Spi_write_uint16_t(&temp, MASK_SPN_ADD + 4 * i, 1); } ``` - 初始化SPN掩码数据,写入固定值; - 用于通信协议中消息过滤或屏蔽机制。 ```c spnCmVersion = 0; Spi_write_uint16_t(&spnCmVersion, MASK_SPN_ADD + 40, 1); ``` - 初始化SPN通信版本号为0。 #### 6. **运行时数据初始化** ```c DATA_REGISTER.runHourResultA = 0; DATA_REGISTER.runMinuteResultA = 0; DATA_REGISTER.runSecondResultA = 0; DATA_REGISTER.numStartResultA = 0; DATA_REGISTER.runGenKwhA = 0; ... Spi_write_uint16_t((uint16_t *)(&DATA_REGISTER.runHourResultA), TOTAL_RUN_HOUR_ADD_USER, 12); ``` - 初始化运行时间、启动次数、发电量等统计数据; - 将这些数据写入外部存储器,供系统重启后读取。 --- ### 函数调用时机: - 通常在系统首次上电、恢复出厂设置、配置重置时调用; - 确保所有默认配置都写入非易失性存储器; - 防止断电后配置丢失; - 同时将配置重新读取到运行时变量中,保证系统使用的是最新配置。 --- ### 相关函数说明: - `Spi_write_uint16_t()` / `Spi_read_uint16_t()`: - SPI通信函数,用于向外部存储器写入/读取16位整型数据; - `HAL_Delay()`: - STM32 HAL库提供的毫秒级延时函数; - `HAL_IWDG_Refresh()`: - 刷新看门狗计数器,防止系统因长时间操作导致看门狗复位。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值