MySQL数据库(八):MySQL索引优化

2023-11-05

1、explain索引优化的查询测试

①员工表

create table staffs(
    id int primary key auto_increment,
    name varchar(24) not null default "",
    age int not null default 0,
    pos varchar(20) not null default "",
    add_time timestamp not null default CURRENT_TIMESTAMP 
)charset utf8; --current_timestamp 默认之后当修改后它的时间就不会发生变化了,即一旦修改不在刷新,current_timestamp on update就可以同步更改

插入员工数据

insert into staffs(`name`,`age`,`pos`,`add_time`) values('z3',22,'manager',now());
insert into staffs(`name`,`age`,`pos`,`add_time`) values('July',23,'dev',now());
insert into staffs(`name`,`age`,`pos`,`add_time`) values('2000',23,'dev',now());

②用户表

create table user(
    id int not null auto_increment primary key,
    name varchar(20) default null,
    age int default null,
    email varchar(20) default null
) engine=innodb default charset=utf8;

插入用户数据

insert into user(name,age,email) values('1aa1',21,'b@163.com');
insert into user(name,age,email) values('2aa2',22,'a@163.com');
insert into user(name,age,email) values('3aa3',23,'c@163.com');
insert into user(name,age,email) values('4aa4',25,'d@163.com');

创建复合索引

create index idx_staffs_nameAgePos on staffs(name,age,pos);

explain 查询语句,索引的口诀如下:
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效(跟创建索引的顺序有关系)
like百分写最右,覆盖索引不写星
不等非空还有or,索引失效要少用
varchar引号不可丢(不加也可以查询出来,sql底层会做一个隐式转,但是索引就会失效),SQL高级也不难
在这里插入图片描述
索引优化使用的练习,对照口诀的使用标准
在这里插入图片描述

2、show profiles 进行sql分析

①是MySQL提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优的测量,连接层、服务层、存储引擎层、文件层的使用情况
在这里插入图片描述
②默认情况下,参数处于关闭状态,并保持最近15次的运行结果。通过set profiling=on修稿当mysql服务重启的时候,配置就会失效,只有修改配置文件才会永久有效
③开启之后,默认会存储15条数据,如果超出会弹出第一条数据,如果想要记录所有sql语句则需要开启记录命令,通过show profiles可以查看自己写的sql语句耗费的时间,查看详情可以通过show profile for query id;来查看
在这里插入图片描述
④查看详情的时候也可以加多个不同的参数去实现

all         显示所有的开销信息
block io    显示块IO相关开销
cpu         显示CPU相关开销信息
ipc         显示发送和接收相关开销信息
memory      显示内存相关开销信息
page faults 显示页面错误相关开销信息

⑤如果出现下列参数说明sql语句必须要做优化了

converting HEAP to MyISAM查询结果太大,内存都不够用了往磁盘上搬
Creating tmp table 创建临时表
Copying to tmp table on disk 把内存中临时表复制到磁盘,危险
locked

在这里插入图片描述
⑥保存所有sql语句到表中的命令(全局查询日志)

set global general_log = 1;      # 开启命令
set global log_output = 'TABLE'; # 将SQL语句写到表中
select * from mysql.general_log; # 你所编写的SQL语句,会记录到MySQL库里的genral_log表

3、trace分析sql优化器

①explain 可以查看 SQL 执行计划,但是无法知道它为什么做这个决策,如果想确定多种索引方案之间是如何选择的或者排序时选择的是哪种排序模式,有什么好的办法吗?
②从 MySQL 5.6 开始,可以使用 trace 查看优化器如何选择执行计划。
通过trace,能够进一步了解为什么优化器选择A执行计划而不是选择B执行计划,或者知道某个排序使用的排序模式,帮助我们更好地理解优化器行为。
③如果需要使用,先开启 trace,设置格式为 JSON,再执行需要分析的 SQL,最后查看 trace 分析结果(在 information_schema.OPTIMIZER_TRACE 中)。
④开启该功能,会对 MySQL 性能有所影响,因此只建议分析问题时临时开启。

3.1使用 trace 进行分析

①开启trace

set session optimizer_trace="enabled=on",end_markers_in_json=on;
optimizer_trace="enabled=on" 表示开启trace
end_markers_in_json=on 表示 JSON 输出开启结束标记

②查看trace分析结果SELECT * FROM information_schema.OPTIMIZER_TRACE\G
结果说明

QUERY: select * from t1 where a >900 and b > 910 order  by a    --SQL语句
TRACE: {
  "steps": [
    {
      "join_preparation": {				--SQL准备阶段
        "select#": 1,
        "steps": [
          {
            "expanded_query": "/* select#1 */ select `t1`.`id` AS `id`,`t1`.`a` AS `a`,`t1`.`b` AS `b`,`t1`.`create_time` AS `create_time`,`t1`.`update_time` AS `update_time` from `t1` where ((`t1`.`a` > 900) and (`t1`.`b` > 910)) order by `t1`.`a`"
          }
        ] /* steps */
      } /* join_preparation */
    },
    {
      "join_optimization": {			--SQL优化阶段
        "select#": 1,
        "steps": [
          {
            "condition_processing": {    --条件处理
              "condition": "WHERE",
              "original_condition": "((`t1`.`a` > 900) and (`t1`.`b` > 910))",        --原始条件
              "steps": [
                {
                  "transformation": "equality_propagation",
                  "resulting_condition": "((`t1`.`a` > 900) and (`t1`.`b` > 910))" 		--等值传递转换
                },
                {
                  "transformation": "constant_propagation",
                  "resulting_condition": "((`t1`.`a` > 900) and (`t1`.`b` > 910))"       --常量传递转换
                },
                {
                  "transformation": "trivial_condition_removal",
                  "resulting_condition": "((`t1`.`a` > 900) and (`t1`.`b` > 910))"        --去除没有的条件后的结构
                }
              ] /* steps */
            } /* condition_processing */
          },
          {
            "substitute_generated_columns": {
            } /* substitute_generated_columns */   --替换虚拟生成列
          },
          {
            "table_dependencies": [		--表依赖详情
              {
                "table": "`t1`",
                "row_may_be_null": false,
                "map_bit": 0,
                "depends_on_map_bits": [
                ] /* depends_on_map_bits */
              }
            ] /* table_dependencies */
          },
          {
            "ref_optimizer_key_uses": [
            ] /* ref_optimizer_key_uses */
          },
          {
            "rows_estimation": [	--预估表的访问成本
              {
                "table": "`t1`",
                "range_analysis": {
                  "table_scan": {
                    "rows": 1000,       --扫描行数
                    "cost": 207.1       --成本
                  } /* table_scan */,
                  "potential_range_indexes": [    --分析可能使用的索引
                    {
                      "index": "PRIMARY",
                      "usable": false,       --为false,说明主键索引不可用
                      "cause": "not_applicable"
                    },
                    {
                      "index": "idx_a",      --可能使用索引idx_a
                      "usable": true,
                      "key_parts": [
                        "a",
                        "id"
                      ] /* key_parts */
                    },
                    {
                      "index": "idx_b",      --可能使用索引idx_b
                      "usable": true,
                      "key_parts": [
                        "b",
                        "id"
                      ] /* key_parts */
                    }
                  ] /* potential_range_indexes */,
                  "setup_range_conditions": [
                  ] /* setup_range_conditions */,
                  "group_index_range": {
                    "chosen": false,
                    "cause": "not_group_by_or_distinct"
                  } /* group_index_range */,
                  "analyzing_range_alternatives": { --分析各索引的成本
                    "range_scan_alternatives": [
                      {
                        "index": "idx_a",	--使用索引idx_a的成本
                        "ranges": [
                          "900 < a"			--使用索引idx_a的范围
                        ] /* ranges */,
                        "index_dives_for_eq_ranges": true, --是否使用index dive(详细描述请看下方的知识扩展)
                        "rowid_ordered": false, --使用该索引获取的记录是否按照主键排序
                        "using_mrr": false,  	--是否使用mrr
                        "index_only": false,    --是否使用覆盖索引
                        "rows": 100,            --使用该索引获取的记录数
                        "cost": 121.01,         --使用该索引的成本
                        "chosen": true          --可能选择该索引
                      },
                      {
                        "index": "idx_b",       --使用索引idx_b的成本
                        "ranges": [
                          "910 < b"
                        ] /* ranges */,
                        "index_dives_for_eq_ranges": true,
                        "rowid_ordered": false,
                        "using_mrr": false,
                        "index_only": false,
                        "rows": 90,
                        "cost": 109.01,
                        "chosen": true             --也可能选择该索引
                      }
                    ] /* range_scan_alternatives */,
                    "analyzing_roworder_intersect": { --分析使用索引合并的成本
                      "usable": false,
                      "cause": "too_few_roworder_scans"
                    } /* analyzing_roworder_intersect */
                  } /* analyzing_range_alternatives */,
                  "chosen_range_access_summary": {  --确认最优方法
                    "range_access_plan": {
                      "type": "range_scan",
                      "index": "idx_b",
                      "rows": 90,
                      "ranges": [
                        "910 < b"
                      ] /* ranges */
                    } /* range_access_plan */,
                    "rows_for_plan": 90,
                    "cost_for_plan": 109.01,
                    "chosen": true
                  } /* chosen_range_access_summary */
                } /* range_analysis */
              }
            ] /* rows_estimation */
          },
          {
            "considered_execution_plans": [  --考虑的执行计划
              {
                "plan_prefix": [
                ] /* plan_prefix */,
                "table": "`t1`",
                "best_access_path": {          --最优的访问路径
                  "considered_access_paths": [ --决定的访问路径
                    {
                      "rows_to_scan": 90,      --扫描的行数
                      "access_type": "range",  --访问类型:为range
                      "range_details": {
                        "used_index": "idx_b"  --使用的索引为:idx_b
                      } /* range_details */,
                      "resulting_rows": 90,    --结果行数
                      "cost": 127.01,          --成本
                      "chosen": true,		   --确定选择
                      "use_tmp_table": true
                    }
                  ] /* considered_access_paths */
                } /* best_access_path */,
                "condition_filtering_pct": 100,
                "rows_for_plan": 90,
                "cost_for_plan": 127.01,
                "sort_cost": 90,
                "new_cost_for_plan": 217.01,
                "chosen": true
              }
            ] /* considered_execution_plans */
          },
          {
            "attaching_conditions_to_tables": {  --尝试添加一些其他的查询条件
              "original_condition": "((`t1`.`a` > 900) and (`t1`.`b` > 910))",
              "attached_conditions_computation": [
              ] /* attached_conditions_computation */,
              "attached_conditions_summary": [
                {
                  "table": "`t1`",
                  "attached": "((`t1`.`a` > 900) and (`t1`.`b` > 910))"
                }
              ] /* attached_conditions_summary */
            } /* attaching_conditions_to_tables */
          },
          {
            "clause_processing": {
              "clause": "ORDER BY",
              "original_clause": "`t1`.`a`",
              "items": [
                {
                  "item": "`t1`.`a`"
                }
              ] /* items */,
              "resulting_clause_is_simple": true,
              "resulting_clause": "`t1`.`a`"
            } /* clause_processing */
          },
          {
            "reconsidering_access_paths_for_index_ordering": {
              "clause": "ORDER BY",
              "index_order_summary": {
                "table": "`t1`",
                "index_provides_order": false,
                "order_direction": "undefined",
                "index": "idx_b",
                "plan_changed": false
              } /* index_order_summary */
            } /* reconsidering_access_paths_for_index_ordering */
          },
          {
            "refine_plan": [          --改进的执行计划
              {
                "table": "`t1`",
                "pushed_index_condition": "(`t1`.`b` > 910)",
                "table_condition_attached": "(`t1`.`a` > 900)"
              }
            ] /* refine_plan */
          }
        ] /* steps */
      } /* join_optimization */
    },
    {
      "join_execution": {             --SQL执行阶段
        "select#": 1,
        "steps": [
          {
            "filesort_information": [
              {
                "direction": "asc",
                "table": "`t1`",
                "field": "a"
              }
            ] /* filesort_information */,
            "filesort_priority_queue_optimization": {
              "usable": false,             --未使用优先队列优化排序
              "cause": "not applicable (no LIMIT)"     --未使用优先队列排序的原因是没有limit
            } /* filesort_priority_queue_optimization */,
            "filesort_execution": [
            ] /* filesort_execution */,
            "filesort_summary": {           --排序详情
              "rows": 90,
              "examined_rows": 90,          --参与排序的行数
              "number_of_tmp_files": 0,     --排序过程中使用的临时文件数
              "sort_buffer_size": 115056,
              "sort_mode": "<sort_key, additional_fields>"   --排序模式(详解请看下方知识扩展)
            } /* filesort_summary */
          }
        ] /* steps */
      } /* join_execution */
    }
  ] /* steps */
}
MISSING_BYTES_BEYOND_MAX_MEM_SIZE: 0	--该字段表示分析过程丢弃的文本字节大小,本例为0,说明没丢弃任何文本
          INSUFFICIENT_PRIVILEGES: 0    --查看trace的权限是否不足,0表示有权限查看trace详情
1 row in set (0.00 sec)

③关闭traceset session optimizer_trace="enabled=off";
TRACE 字段中整个文本大致分为三个过程。
准备阶段:对应文本中的 join_preparation
优化阶段:对应文本中的 join_optimization
执行阶段:对应文本中的 join_execution
使用时,重点关注优化阶段和执行阶段。
explain:获取 MySQL 中 SQL 语句的执行计划,比如语句是否使用了关联查询、是否使用了索引、扫描行数等;
trace:查看优化器如何选择执行计划,获取每个可能的索引选择的代价。

4、索引的执行

-- 创建员工表
create table staffs(
    id int primary key auto_increment,
    name varchar(24) not null default "",
    age int not null default 0,
    pos varchar(20) not null default "",
    add_time timestamp not null default CURRENT_TIMESTAMP 
)charset utf8;
-- 创建用户表
create table user(
    id int not null auto_increment primary key,
    name varchar(20) default null,
    age int default null,
    email varchar(20) default null
) engine=innodb default charset=utf8;
-- 为员工表插入数据
insert into staffs(`name`,`age`,`pos`,`add_time`) values('z3',22,'manager',now());
insert into staffs(`name`,`age`,`pos`,`add_time`) values('July',23,'dev',now());
insert into staffs(`name`,`age`,`pos`,`add_time`) values('2000',23,'dev',now());
-- 为用户表插入数据
insert into user(name,age,email) values('1aa1',21,'b@163.com');
insert into user(name,age,email) values('2aa2',22,'a@163.com');
insert into user(name,age,email) values('3aa3',23,'c@163.com');
insert into user(name,age,email) values('4aa4',25,'d@163.com');
-- 创建复合索引为之后的测试做准备
create index idx_staffs_nameAgePos on staffs(name,age,pos);

通过explain来分析用到了哪些索引

4.1索引执行的规则

全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
like百分写最右,覆盖索引不写星
不等非空值还有or,索引失效要少用
varchar引号不可丢,SQL高级也不难

(将所有的索引全部都用上,这是最优的索引执行)、(如果创建的第一个索引没有用上则不会使用到索引)、(索引创建的顺序如果中间的索引没有使用则不能向下使用索引)、(索引使用的时候不能加上函数比如date、lower等)、(不能给索引做加减等计算)、(不能给索引做范围运算,不然索引只能使用本级和上级索引)、(like ‘是%’,将%写在最右边,如果项目中用模糊查找非常浪费性能,一般全文匹配会用es,如果非要写%是%,那么select后面跟对应索引字段,也可以用到索引)、(用什么取什么)、(<>、!=、not null、or会导致索引的失效)、(如果varchar查询整数,mysql会默认加上引号引擎帮做的隐式转换,但是索引就会失效,虽然查询的出数据,但是时间一长,项目就会变得特别慢)

在这里插入图片描述

5、索引优化的案例

5.1单表优化

①建表

create table article(
    id int unsigned not null primary key auto_increment,
    author_id int unsigned not null,
    category_id int unsigned not null,
    views int unsigned not null,
    comments int unsigned not null,
    title varchar(255) not null,
    content text not null
);

②插入数据

insert into article(`author_id`,`category_id`,`views`,`comments`,`title`,`content`) values 
(1,1,1,1,'1','1'),
(2,2,2,2,'2','2'),
(1,1,3,3,'3','3');

需求:查询category_id为1且comments大于1的情况下,views最多的article_id
在这里插入图片描述
在这里插入图片描述
优化时候首先考虑的是创建索引,再去跟没有创建索引的时候做对比,可能是因为范围查询有大于号所以会出现文件内排序,考虑讲大于号变为等号,文件内排序优化成功,但是题目就发生变化了,所以不能这样修改
在这里插入图片描述
在这里插入图片描述

5.2双表优化

①建表
商品类别表

create table class(
    id int unsigned not null primary key auto_increment,
    card int unsigned not null
);

图书表

create table book(
    bookid int unsigned not null auto_increment primary key,
    card int unsigned not null
);

left join往右表添加索引,驱动表的概念,mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL数据库(八):MySQL索引优化 的相关文章

  • MySQL~数据库的设计

    二 数据库的设计 1 多表之间的关系 1 1 三种分类 一对一 分析 一个人只有一个身份证 一个身份证只能对应一个人 如 人和身份证 一对多 如 部门和员工 分析 一个部门有多个员工 一个员工只对应一个部门 多对多 如 学生和课程 分析 一
  • Mysql数据库迁移:善用Navicat工具,事半功倍

    数据库迁移 在说到数据库迁移方面 像很多开发工作一样 简单有简单的做法 复杂有复杂的做法 就看怎么做了 那么什么样子的数据库迁移方式才是最优的 在这里是没有准确的定义的 但是我这边分享一个比较简单而言的数据库迁移方案 一 迁移方案描述 例如
  • MySQL字段约束条件,外键约束条件,表关系

    目录 字符编码与配置文件 统一字符编码 存储引擎 修改存储引擎的方式 自定义选项存储引擎 不同存储引擎产生的表文件有几个 MERGE InnoDB Archive BLACKHOLE blackhole与memory存取数据的特征 Blac
  • 【MySQL进阶】SQL性能分析

    一 SQL性能分析 1 SQL执行频率 MySQL 客户端连接成功后 通过 show session global status 命令可以提供服务器状态信 息 通过如下指令 可以查看当前数据库的 INSERT UPDATE DELETE S
  • 数据库---MySQL的命令行命令(在已创建的表中添加主键、自增、默认值)

    1 MySQL命令行创建一个订单表 mysql gt create table order table gt order id int not null gt price float 10 2 gt user id int 创建成功 效果如
  • 【Mysql数据库全套教程笔记-SELECT使用篇】

    Mysql基础篇 SELECT使用篇 SQL之SELECT使用篇 第03章 基本的SELECT语句 第04章 运算符 第05章 排序与分页 第06章 多表查询 第07章 单行函数 第08章 聚合函数 第09章 子查询 我做的笔记 希望能帮助
  • MySQL8数据库原理与应用(微课版)课后笔记-实训7

    最近学习笔记记录 仅供学习参考 在完成课后实训7前所需的建表语句如下 CREATE TABLE bmdmb bmh varchar 10 NOT NULL COMMENT 部门号 bmmc char 50 NOT NULL COMMENT
  • MySQL - 第9节 - MySQL内外连接

    目录 1 内连接 2 外连接 2 1 左外连接 2 2 右外连接 3 简单案例 1 内连接 表的连接分为内连接和外连接 内连接实际上就是利用where 子句对两种表形成的笛卡儿积进行筛选 我们前面学习的查询都是内连接 也是在开发过程中使用的
  • column in where clause is ambiguous MySQL异常

    在多表连接查询中 若连接条件字段在多个表中同名 却没有使用全限定名称 如 logicdeleteFlag 执行时会报这个异常 MySQL没办法识别 这个字段指的是哪个表的字段 必须使用全限定名称 如 tableName logicdelet
  • MySQL数据库的备份、恢复、导出、导入(bin log和mydump)

    目录 一 使用 bin log 来恢复数据 一 bin log的三种格式 1 statement 基于SQL语句的复制 statement based replication SBR 2 row 基于行的复制 row based repli
  • Java实现登录[数据库]

    和上篇的随机点名系统一样 都是使用MySQL数据库来实现 因为刚学所以写点简单例子满足下自己 需求分析 1 输入用户名和密码 2 与数据库中的记录进行比较 原理比较 简单 直接贴代码吧 import java sql Connection
  • mysql的数据备份脚本

    一 数据库的备份脚本脚本命令 1 核心命令 usr local mysql bin mysqldump h IP p3306 u dbuser p dbpasswd f A F E R quick single transaction fl
  • 【MYSQL基础(一)】——数据类型的详细解析. 数据库基本操作

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 一 为什么要使用MySQL数据库 二 数据库的基本概念 数据库和数据库
  • MySQL 事务隔离级别,读现象,MVCC

    目录 数据库读现象 事务隔离级别 错误日志 详情参见 MySQL日志管理 JasonJi 博客园 mvcc多版本并发控制 多版本并发控制mvcc multi version concurrency controll 基于多版本的并发控制 在
  • 使用Navicat+Premium模型设计表之间关系图(1:n;n:n)

    一 设计E R图之间关系 1 打开Navicat Premium软件 开始设计表 2 设计表之间的关系 操作步骤 选中关系图标 将某张表的一个字段拖动到另外一张表的字段 设计表之间的关系 4 导出成png 5 保存模型 使用Navicat逆
  • Java面向对象编程

    一个关系数据库文件中的各条记录 A 前后顺序不能任意颠倒 一定要按照输入的顺序排列 B 前后顺序可以任意颠倒 不影响库中的数据关系 C 前后顺序可以任意颠倒 但排列顺序不同 统计处理的结果就可能不同 D 前后顺序不能任意颠倒 一定要按照关键
  • mysql数据库非正常关机报错,启动时mysql被killed掉

    阿里云服务器centos7 6 mysql数据库5 6 44 mysql启动报错 usr bin mysqld safe line 183 15006 Killed nohup usr sbin mysqld basedir usr dat
  • 1.MySQL数据库的基本操作

    数据库操作过程 1 用户在客户端输入 SQL 2 客户端会把 SQL 通过网络发送给服务器 3 服务器执行这个 SQL 把结果返回给客户端 4 客户端收到结果 显示到界面上 数据库的操作 这里的数据库不是代表一个软件 而是代表一个数据集合
  • mysql语法之update

    Update 语句 1 作用 Update 语句用于修改表中的数据 语法 UPDATE 表名称 SET 列名称 新值 WHERE 列名称 某值 1 建表语句 create table table1 idd varchar 10 val va
  • Python Flask+Echarts+sklearn+MySQL(评论情感分析、用户推荐、BI报表)项目分享

    Python Flask Echarts sklearn MySQL 评论情感分析 用户推荐 BI报表 项目分享 项目背景 随着互联网的快速发展和智能手机的普及 人们越来越倾向于在网上查找餐厅 购物中心 酒店和旅游景点等商户的点评和评分信息

随机推荐

  • 重新配对_Apple Watch配对失败的解决办法

    昨晚上我把那支用了将近三年的3代苹果表重置之后 打算重新配对 结果第一次碰上了配对失败的问题 弹窗提示我可能连接了不受信任的网络 前后用无线网和4G网络试了很多次 都是一样的结果 百度解决方法也完全没头绪 今天下午终于在苹果客服的帮助下解决
  • 这个落泪的男人叫王坚

    这个落泪的男人叫王坚 前段时间新闻报道 说一个名叫Watson的人工智能 花十几分钟读完2000万页医疗文献之后 解决了医生都束手无策的病情 听着感觉这人工智能跟打败世界棋手李世石的AlphaGO 阿尔法狗 相比弱爆了 但要知道那可是200
  • Vulkan入门(一)-环境配置.md

    文章目录 参考资料 简述 一 准备环境 1 1 开发环境 1 2 下载 SDK 1 3 安装SDK 1 4 安装驱动 1 5 运行示例程序 二 GLFW 安装 三 GLM 安装 四 手动编译示例代码 4 1 在编译示例代码的时候老是报错 找
  • MySQL 下载安装教程

    MySQL Community 8 0 安装教程 说明 步骤 说明 本教程只是 Windows 下 MySQL 的一种集成 IDE 的安装教程 安装此 IDE 还免去了手动在 Windows 上配置 MySQL 的麻烦 不过如果读者对 My
  • 国产 CAE 软件研发

    1 简介 国产 CAE 软件研发的特点 国家重大需求 自主知识产权 架构灵活 二次开发 通用化 定制化 2 CAE 软件研发 现状和意义 我国自主开发商业化程度高 通用性强的 CAE 软件 尤其是开发带良好图形用户界面的前后处理器的工作还十
  • RISC-V from scratch 5:机器模式

    RISC V from scratch 5 机器模式 接上一篇博客 我今天继续写 RISC V from scratch 系列博客 原本我打算将该英文系列全部翻译成中文 但原作者貌似没有把这一系列完成就咕咕了 因此本文的内容是我自己实践的内
  • 企业级远程桌面,需要考虑哪些核心因素?

    随着经济的发展 现代企业的管理模式也在发生改变 2020年初 新冠疫情爆发 所有的企业都无法按时返工 各个企业都开始寻求新的办公模式 埃森哲2021最新报告中有一个数据显示 87 的高管人员认为 远程劳动力为劳动人才市场打开了新天地 且扩大
  • 《信号与系统》解读 前言:经典教材的选择

    1 教材选择 信号与系统 系统的教材很多 分国内与国外教材 专题以 信号与系统 奥本海姆第二版为基础与主线 结合LTE 5G移动通信的工程实践需要 有选择性的对理论内容进行解读 2 主要内容 信号与系统 是美国麻省理工学院 MIT 的经典教
  • Stata计算可操纵性应计利润——基于琼斯模型

    说明 数据 变量名称来源于国泰安数据库 具体名称可见国泰安数据库资产负债表 利润表 本代码仅供参考 代码实现 基本Jones模型 Jones 1991 提出了经典的Jones模型 从营业收入变动和固定资产水平衡量企业应计利润的变动 clon
  • Java中文与Base64互转(解决中文乱码的问题)

    最近线上出现一个问题 前后端交互时 某些情况下 会有中文乱码的问题 解决思路 1 在后端先将中文转为 Base64 后再传递到前端 此中文在前端不做显示处理 2 前端将参数再传递回后端时 后端解析 Base64 得到中文字符串 packag
  • 9个免费的矢量图网站

    寻找一些特别的 为众所不知的矢量图网站不是一件容易的事情 又要高质量 又要免费使用 尽管鱼和熊掌不能兼得 但是谁叫我们碰到了互联网时代呢 谁叫我们知道一句台词 一切皆有可能呢 这些免费的矢量图网站是我在互联网上搜索到的 经过权衡和对比 选择
  • 设计模式——装饰模式

    装饰模式 1 装饰模式动机及定义 1 1模式动机 买了新房 毛胚房 需要装修 对新房进行装修并没有改变房子用于居住的本质 但它让房子变的更漂亮 更加满足居家的需求 在软件设计中 我们也可以用类似的技术对原有对象 新房 的功能进行扩展 装修
  • 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

    一 阿里巴巴笔试题 public class Test public static int k 0 public static Test t1 new Test t1 public static Test t2 new Test t2 pu
  • 第19课:生活中的访问模式——一千个读者一千个哈姆雷特

    用程序来模拟生活 从剧情中思考访问模式 访问模式 访问模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 优缺点 访问模式的优点 访问模式的缺点 实战应用 应用场景 故事剧情 光阴似箭 转眼间作为
  • 梁乾东:4.16黄金走势上涨冲破天际,今日黄金原油在线建议附解套

    消息面解析 周四 4月15日 美国原油上涨 因美国原油库存下降支持全球需求复苏的希望 总体来看 美国原油库存下降提振了对需求改善的乐观情绪 美联储褐皮书中对美国经济的乐观预期利好油价 此外早间沙特拦截了胡塞武装发射的两枚导弹和四架无人机 中
  • 互联网日报

    今日看点 嫦娥五号探测器成功实施近月制动 顺利进入环月轨道 中国移动香港实现5G独立组网 助力建设世界级智慧城市 哈啰出行换电业务启用全新品牌 小哈换电 开启两轮换电新纪元 翰森制药钟慧娟成中国及全球白手起家女首富 财富达1350亿元 交通
  • 【C++】是内存管理,但C++ !! && 模板初阶

    目录 一 回望C语言内存 二 C 内存管理方式 1 内置类型 2 自定义类型 3 new malloc 返回内容区别 4 operator new operator delete 5 malloc free和new delete的区别总结
  • 数据库控制台宽度和分页长度设置

    通常情况下 我们的控制台的显示 如果不加以设定 不好阅读 因为控制台显示一行的长度不够 我们可以进入sql控制后 执行set line 2000 pagesize 200 SQL gt set line 2000 pagesize 200
  • 2023,大展宏「兔」|拓数派期待与您共同绽放最绚丽的烟火

  • MySQL数据库(八):MySQL索引优化

    1 explain索引优化的查询测试 员工表 create table staffs id int primary key auto increment name varchar 24 not null default age int no