Mysql性能调优

2023-05-16

目录

一.Mysql架构设计

1.Mysql架构图       

二.Mysql常见的存储引擎

1.InnoDB引擎

2.MyISAM存储引擎

3.MEMORY存储引擎

三.Mysql索引

1.索引的分类

2.mysql中空值和null的区别

3.mysql中索引的查询和删除

4.索引的优缺点分析

5.索引的数据结构

6.Mysql的索引实现

如何避免回表?

四.Mysql性能调优

1.Mysql性能优化的思路

2.开启mysql的慢查询日志

3.MySQL性能分析 EXPLAIN

4.如何避免回表

5.索引优化案例

五.Mysql索引失效场景


一.Mysql架构设计

1.Mysql架构图       

        MySQL 架构可以分为 Server层Engine层两部分,架构图如下

二.Mysql常见的存储引擎

1.InnoDB引擎

(1)概述

        InnoDB是事务型数据库的首选引擎。支持事务(ACID)支持行级锁支持外键

(2)使用场景

        如果需要对事务的完整性要求比较高,或者需要频繁的更新、删除操作的数据库,都可以选择InnoDB。

(3)数据落盘

        使用 InnoDB存储引擎 MySQL将在数据目录下创建一个名为 ibdata1的10MB大小的自动扩展数据文件,以及两个名为 ib_logfile0和 ib_logfile1的5MB大小的日志文件。

2.MyISAM存储引擎

(1)概述

        MyISAM拥有较高的插入、查询速度,空间和内存使用比较低,但不支持事务。

(2)使用场景

        如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。

(3)数据落盘

        使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)。

3.MEMORY存储引擎

(1)概述

        MEMORY存储引擎将所有的数据都在内存中,数据的处理速度快,但是安全性不高。

(2)使用场景

        如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

注意:同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

三.Mysql索引

1.索引的分类

(1)主键索引

        设定为主键后,数据库自动建立索引,InnoDB为聚簇索引,主键索引列值不能为空(Null)。

# (1) 创建表添加主键索引
CREATE TABLE `table_name` (
    [...] ,
    PRIMARY KEY (`col_name`),
)
# (2) 添加主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY (`col_name`);

(2)普通索引(单列索引)

        单列索引是最基本的索引,它没有任何限制。

#  (1) 直接创建索引
CREATE INDEX index_name ON table_name(`col_name`);
#  (2) 修改表结构的方式添加索引
ALTER TABLE `table_name` ADD INDEX index_name(`col_name`);
#  (3) 创建表的时候同时创建索引
CREATE TABLE `table_name` (
    [...] ,
    PRIMARY KEY (`id`),
    INDEX index_name (`col_name`)
)
#  (4) 删除索引
DROP INDEX index_name ON table_name;   
alter table `表名` drop index 索引名;

(3)复合索引

        复合索引是在多个字段上创建的索引。复合索引遵守“最左前缀”原则即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。

# (1)创建一个复合索引
create index index_name on table_name(`col_name1`,`col_name2`,...);
# (2)修改表结构的方式添加索引
alter table table_name add index index_name(`col_name1`,`col_name2`,...);

(4)唯一索引

        唯一索引和普通索引类似,主要的区别在于,唯一索引限制列的值必须唯一,但允许存在空值(只允许存在一条空值)

-- (1)创建唯一索引
# 创建单个索引
CREATE UNIQUE INDEX index_name ON table_name(`col_name`);

# 创建多个索引
CREATE UNIQUE INDEX index_name on table_name(`col_name`,...);

-- (2)修改表结构
# 单个
ALTER TABLE table_name ADD UNIQUE index index_name(`col_name`);
# 多个
ALTER TABLE table_name ADD UNIQUE index index_name(`col_name`,...);

-- (3)创建表的时候直接指定索引
CREATE TABLE `table_name` (
    [...] ,
    PRIMARY KEY (`id`),
    UNIQUE index_name_unique(`col_name`)
)

2.mysql中空值null的区别

“空值” 和”NULL”的概念: 
1:空值是不占用空间的 .
2: MySQL中的NULL其实是占用空间的.

长度验证:注意空值的之间是没有空格的。

> select length(''),length(null),length(' ');
+------------+--------------+-------------+
| length('') | length(null) | length(' ') |
+------------+--------------+-------------+
|          0 |         NULL |           1 |
+------------+--------------+-------------+

3.mysql中索引的查询和删除

#查看:
show indexes from `表名`;
#或
show keys from `表名`;
 
#删除
alter table `表名` drop index 索引名;

4.索引的优缺点分析

(1)优点

        大大提高数据查询速度

(2)缺点

        索引会占据磁盘空间

        降低更新表的效率

        维护索引需要消耗数据库资源

5.索引的数据结构

(1)索引数据结构类型

        MySQL索引使用的数据结构主要有BTree索引hash索引

(2)Hash索引

        对于hash索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景建议选择BTree索引。

(3)BTree索引

        B+树可以保证等值和范围查询的快速查找,MySQL的索引就采用了B+树的数据结构。

6.Mysql的索引实现

(1)InnoDB索引

        <1> 聚簇索引

        聚簇索引 叶子节点存储的数据是整行记录。聚簇索引使用B+树构建,一般情况下,聚簇索引等同于主键索引,当一个表没有创建主键索引时,InnoDB会自动创建一个ROWID字段来构建聚簇索引。

        <2> 辅助索引

       辅助索引, 除聚簇索引之外的所有索引都称为辅助索引。InnoDB的辅助索引只会存储主键值而非磁盘地址。

如下查询age = 19的数据,需要根据辅助索引age查到 age= 19 对应的id,再根据id回表查询全部数据。

         以上回表的操作,在数据量比较大的时候,回表必然会消耗很多的时间影响性能。

如何避免回表?

        使用覆盖索引查询(创建联合索引,让创建的索引包含查询结果)

举例:创建一张user表

CREATE TABLE `user`
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name`  int(11)     DEFAULT NULL,
  `sex`  char(3)     DEFAULT NULL,
  `address`  varchar(10) DEFAULT NULL,
  `hobby`  varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `i_name` (`name`)
) ENGINE = InnoDB;
-- 查询名字为张三的数据
select id,name,sex from user where name = 'zhangsan';

        这个语句在业务上频繁使用到,而user表中的其他字段使用频率远低于这几个字段,如果我们使用联合索引(name,sex),查询到的结果就包括了我们所需要的查询结果的所有字段的完整数据,这样就不需要再次回表查询去检索sex字段的数据了。

覆盖索引和联合索引的概念

        覆盖索引是指查询语句查询方式(查询的结果包含了联合索引,以此来避免回表);

        联合索引是指索引类型

(2)MyIsam索引

         <1> 主键索引

        MyISAM的数据文件和索引文件是分开存储的。MyISAM使用B+树构建索引树时,叶子节点中存储的键值为索引列的值,数据为索引所在行的磁盘地址。

        <2> 辅助索引

       在MyISAM存储引擎中,辅助索引和主键索引的结构是一样的,没有任何区别。 主键列索引的键值是唯一的,而辅助索引的键值是可以重复的。

四.Mysql性能调优

1.Mysql性能优化的思路

(1)首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句
(2)其次使用explain命令去查询由问题的SQL的执行计划
(3)最后可以使用show profile[s] 查看有问题的SQL的性能使用情况
(4)优化SQL语句

2.开启mysql的慢查询日志

(1)临时开启

set global slow_query_log=on;
set global long_query_time=1;

(2)永久开启

        修改/etc/my.cnf,添加以下内容,然后重启MySQL服务

[mysqld]
lower_case_table_names=1
slow_query_log=ON
#慢查询日志存放位置
slow_query_log_file=D:\dev\mysql-8.0.22-winx64\data\DESKTOP-LEC7QQM-slow.log
long_query_time=1

(3)查看是否开启慢查询

SHOW VARIABLES LIKE "%slow_query%" ;
结果字段说明:
slow_query_log:是否开启慢查询,on为开启,off为关闭;
slow_query_log_file:慢查询日志文件路径

 (4)慢查询日志分析

慢查询日志打开如下所示 

第1行:SQL查询执行的具体时间
第2行:执行SQL查询的连接信息,用户和连接IP
第3行:记录了一些我们比较有用的信息,
    Query_timme,这条SQL执行的时间,越长则越慢
    Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
    Rows_sent,查询返回的行数
    Rows_examined,查询检查的行数,越长就越浪费时间
第4行:设置时间戳,没有实际意义,只是和第一行对应执行时间。
第5行:执行的SQL语句记录信息

3.MySQL性能分析 EXPLAIN

EXPLAIN字段介绍

(1)id

        select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序,id值越大优先级越高,越先被执行,id相同,执行顺序由上至下。

(2)select_type 

        查询类型,主要用于区别普通查询,联合查询,子查询等的复杂查询。

simple:简单的select查询,查询中不包含子查询或者UNION
primary :  表示包含子查询的语句(最外层)
subquery : 在select或where列表中包含的子查询
derived : 在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放到临时表中
union :  如果第二个select出现在UNION之后,则被标记为UNION,如果union包含在from子句的子查询中,外层select被标记为derived
union result : UNION 的结果

(3)table

        查询的表名

(4)type

        type显示的是连接类型,是较为重要的一个指标。(一般来说,需要保证查询至少达到 range级别,最好能到ref)

-- 从好到差依次为
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
-- 简化
system > const > eq_ref > ref > range > index > ALL
system: 表仅有一行 (等于系统表)。这是const连接类型的一个特例,很少出现。
const: 表示通过索引一次就找到了。
eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配. 常见与主键或唯一索引扫描。
ref: 非唯一性索引扫描, 返回匹配某个单独值的所有行, 本质上也是一种索引访问, 它返回所有匹配某个单独值的行, 这是比较常见连接类型。
range: 只检索给定范围的行,使用一个索引来选择行。
index: 出现index 是 SQL 使用了索引, 但是没有通过索引进行过滤,一般是使用了索引进行排序分组。比如:EXPLAIN SELECT * FROM L1 ORDER BY id;
ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。

(5)possible_keys 

        显示可能用到的索引

(6)key

        实际使用的索引,若为null,则没有使用到索引。(两种可能,1.没建立索引, 2.建立索引,但索引失效)。查询中若使用了覆盖索引,则该索引仅出现在key列表中。

(7)key_len

        表示索引中使用的字节数, 可以通过该列计算查询中使用索引的长度。key_len 字段能够帮你检查是否充分利用了索引。

ken_len 越长, 说明索引使用的越充分。

(8)ref 

        显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

(9)rows 

        表示找到所需的记录所需要读取的行数,越少越好。

(10)filtered

        它指返回结果的行占需要读到的行(rows列的值)的百分比,越大越好。

(11)Extra

        Extra 是 EXPLAIN 输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息。

Extra主要指标的含义(有时会同时出现)如下

using index:使用覆盖索引的时候就会出现
Using filesort:得到所需结果集,需要对所有记录进行文件排序。这类SQL语句性能极差,需要进行优化。(典型的,在一个没有建立索引的列上进行了order by,就会触发filesort,常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序。)
using where:在查找使用索引的情况下,需要回表去查询所需的数据
using index condition:查找使用了索引,但是需要回表查询数据
using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
Using temporary:说明需要建立临时表 (temporary table) 来暂存中间结果。
Using join buffer (Block Nested Loop) 说明,需要进行嵌套循环计算, 这里每个表都有五条记录,内外表查询的type都为ALL。
问题在于两个关联表join 使用 uname,关联字段均未建立索引,就会出现这种情况。
常见的优化方案是,在关联字段上添加索引,避免每次嵌套循环计算。

explain总结

当一个sql需要进行优化时,可以从一下几个方面进行考量:

表的读取顺序。(对应id)
数据读取操作的操作类型。(对应select_type)
哪些索引可以使用。(对应possible_keys)
哪些索引被实际使用。(对应key)
每张表有多少行被优化器查询。(对应rows)
评估sql的质量与效率 (对应type)

4.如何避免回表

使用覆盖索引查询(创建联合索引,让创建的索引包含查询结果)

5.索引优化案例

(1)驱动表

        多表关联查询时,第一个被处理的表就是驱动表,使用驱动表去关联其他表。

驱动表的确定非常的关键,会直接影响多表关联的顺序,也决定后续关联查询的性能。

驱动表选取规则:在对最终的结果集没有影响的前提下,优先选择结果集最小的那张表作为驱动表。

-- user表为驱动表,order表为被驱动表
select * from user t1 left join order t2 on t1.id = t2.user_id;
-- 转换成代码就是:
for(user表行 uRow : user表){
    for(Order表的行 oRow : order表){
        if(uRow.id = oRow.user_id){
            return uRow;
        }
    }
}

(2)join buffer

        MySQL 默认 buffer 大小 256K,如果有 n 个 join 操作,会生成 n-1 个 join buffer。

mysql> show variables like '%join_buffer%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| join_buffer_size | 262144 |
+------------------+--------+

mysql> set session join_buffer_size=262144;
Query OK, 0 rows affected (0.00 sec)

优化方案

1.永远用小结果集驱动大结果集(其本质就是减少外层循环的数据数量);
2.为匹配的条件增加索引(减少内层表的循环匹配次数);
3.增大join buffer size的大小(一次缓存的数据越多,那么内层包的扫表次数就越少);
4.减少不必要的字段查询(字段越少,join buffer 所缓存的数据就越多)。

(3)in和exists函数

        优化方案:in后面跟的是小表,exists后面跟的是大表。

(4)order by 优化

        尽量减少额外的排序,通过索引直接返回有序数据。

排序优化案例:

为 employee 表创建以下辅助索引,聚簇索引为id
-- 联合索引
ALTER TABLE employee ADD INDEX idx_name_age(NAME,age);

-- 为薪资字段添加索引
ALTER TABLE employee ADD INDEX idx_salary(salary);

场景1:只查询用于排序的 索引字段, 可以利用索引进行排序,最左原则

        查询 name, age 两个字段, 并使用 nameage 行排序

场景2:排序字段在多个索引中,无法使用索引排序

        查询 name , salary 字段, 并使用 namesalary 排序

场景3只查询用于排序的索引字段和主键, 可以利用索引进行排序

        查询 id , name , 使用 name 排序

场景4:查询主键之外的没有添加索引的字段,不会利用索引排序

        查询 dep_id ,使用 name 进行排序

场景5:排序字段顺序与索引列顺序不一致,无法利用索引排序

        使用联合索引时, ORDER BY子句也要求, 排序字段顺序和联合索引列顺序匹配。

场景6:where 条件是 范围查询时, 会使order by 索引 失效

        添加一个条件 : age > 18 ,然后再根据 age 排序。

场景7:ORDERBY子句不要求必须索引中第一列,没有仍然可以利用索引排序。但是有个前提条件,只有在等值过滤时才可以,范围查询时不可以

 场景8:升降序不一致,无法利用索引排序

        name字段升序,age字段降序,索引失效

(5)count(*) 和 count(1)和count(列名)区别

        <1> 执行效果:
            count(*) 包括了所有的列,在统计时 不会忽略列值为null的数据.
            count(1) 用1表示代码行,在统计时,不会忽略列值为null的数据.
            count(列名)在统计时,会忽略列值为空的数据,就是说某个字段的值为null时不统计.
        <2> 执行效率:
            列名为主键, count(列名)会比count(1)快
            列名为不是主键, count(1)会比count(列名)快
            如果表没有主键,count(1)会比count(*)快
            如果表只有一个字段,则count(*) 最优

(6)datetime优化

        问题:为datetime类型字段创建索引,查询时需要转换为日期再匹配,需要查询出所有行进行过滤, 所以会导致索引失效。

        优化方案:改为使用 between ... and ... ,使索引生效。

EXPLAIN SELECT NAME,mobile FROM user_contacts  WHERE DATE_FORMAT(create_date,'%Y-%m-%d')='2017-02-16';

EXPLAIN SELECT NAME,mobile FROM user_contacts  WHERE create_date 
BETWEEN '2017-02-16 00:00:00' AND '2017-02-16 23:59:59';

 (7)分页优化

        需求:获取用户通讯录表第10万条数据开始后的100条数据

-- 查询记录量越来越大,所花费的时间也会越来越多
EXPLAIN SELECT * FROM user_contacts uc LIMIT 1000000,1000;

 优化方案:使用子查询优化,先查出索引的分页位置,再根据索引查询数据。

-- 根据获取到的id值向后查询.
EXPLAIN SELECT * FROM user_contacts WHERE id >=
(SELECT id FROM user_contacts LIMIT 100000,1) LIMIT 100;

五.Mysql索引失效场景

1.不满足最左前缀原则

2.select * (尽量使用覆盖索引)

3.索引列上有计算或者函数

4.like左边包含%(使用覆盖索引可以使左边加%也能走索引)

5.not in 和not exists 和 <> 和 is null 和 is not null

6.字段类型不同(比如字符串类型 不加引号)

7.范围查询右边的条件索引全部失效

8. or 连接

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

Mysql性能调优 的相关文章

  • 使用 php 和 mysql 计算日期差(以小时为单位)

    我如何使用 php 和 mysql 找到以小时为单位的日期差异 Use TIMEDIFF http dev mysql com doc refman 5 1 en date and time functions html function
  • 使用 Sequelize (NodeJS) 代替 * 指定特定字段

    好吧 我在 NodeJS 中有一个项目 我正在其中使用 Sequelize 来实现 MySQL ORM 这件事工作得非常好 但是我试图弄清楚是否有一种方法可以指定在查询的基础上返回哪些字段 或者是否有一种方法可以在某处执行 query 例如
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • MySQL Tinybit(1) 通过视图的列

    我有一个连接 2 个表的视图 其中一个表具有表示布尔值的tinyint 1 类型的列 该表在连接时并不总是有条目 因此当行丢失时视图需要采用 0 false 值 我希望视图公开 TINYINT 1 类型且 NOT NULL 类型的列 因为它
  • MySQL,连接两列

    MySQL 表中有两列 SUBJECT and YEAR 我想生成一个字母数字唯一编号 其中包含主题和年份的串联数据 我怎样才能做到这一点 是否可以使用像这样的简单运算符 您可以使用CONCAT http dev mysql com doc
  • 如何在 Ansible 中运行 MySQL 查询

    我需要编写一个 Ansible 脚本来在 MySQL 数据库中执行 SQL 查询 这是我尝试过的 你能指导一下吗 hosts localhost tasks name retrive data command mysql u root h
  • MySQL InnoDB引擎是否对只读事务运行任何性能优化

    根据参考文档 只读事务标志可能会提示存储引擎运行一些优化 设置会话事务只读 如果事务访问模式设置为 READ ONLY 则对表进行更改 被禁止 这可能使存储引擎能够提高性能 不允许写入时可能进行的改进 InnoDB引擎是否对只读事务运行这样
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • 使用表白名单选项更新 Debezium MySQL 连接器

    我正在使用 Debezium 0 7 5 MySQL 连接器 并且我试图了解如果我想使用以下选项更新此配置 最好的方法是什么table whitelist 假设我创建了一个连接器 如下所示 curl i X POST H Accept ap
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • mysql 查询选择当月的所有行?

    我有一个名为 startdate 的日期时间类型的列 我必须获取当前月份的开始日期和结束日期之间的所有行 即从 1 11 2014 到 30 11 2014 select from your table where year curdate
  • 使用嵌入qt的mysql?

    我正在尝试使用嵌入 QT 的 mysql 我已经有一个与 mysqld 链接的 Qt mysql 插件 该插件可以很好地加载嵌入式数据库 但 QT 没有简单的方法来设置 dataDir 等嵌入式选项 我在这里看到 http doc qt i
  • 执行mvn sql:execute时出错

    我希望 Maven 执行该 sql 文件 它生成的数据库模式稍后将在我的程序中使用 但它不起作用 可能是由 DELIMITER 引起的 当我执行 mvn sql execute 时 它会打印出 ERROR Failed to execute
  • 使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

    要在 PostgreSQL 中插入批量数据 填充数据库 最快的方法是使用 COPY Source https stackoverflow com questions 758945 whats the fastest way to do a
  • 使用 MySQL 计算时间线中的变化

    我是 MySQL 新手 我需要你的帮助 我有一个包含类似数据的表 RobotPosX RobotPosY RobotPosDir RobotShortestPath 0 1 0 2 15 1456 0 2 0 3 30 1456 0 54
  • 从heroku 提取数据库失败并出现 Encoding::CompatibilityError

    我在执行 db pull 从 heroku 回到本地开发环境时遇到一些问题 我的设置是通过 RVM 在 Mac OS X Snow Leopard 下的本地 Rails 3 Ruby 1 9 2 环境上通过 MacPorts 安装 MySQ
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod
  • 导轨中的多个 DB 连接

    我正在尝试在 ROR 应用程序中连接多个数据库 我的 database yml 如下所示 在你的database yml文件中 发展 adapter mysql username root password database example

随机推荐

  • AtCoder Beginner Contest 190 ABCDEF(差一点ak。。。E超出了我的水平qwq)

    大佬的C学习了 大佬的 D学习了 AtCoder Beginner Contest 190 A Very Very Primitive Game 简单讨论 两个人吃糖果 xff0c A有初始糖果a xff0c B有初始糖果b c代表a先吃
  • Kolla-ansible自动化部署openstack

    Kolla ansible自动化部署openstack kolla ansible简介 kolla 的使命是为 openstack 云平台提供生产级别的 开箱即用的交付能力 kolla 的基本思想是一切皆容器 xff0c 将所有服务基于 D
  • win11下安装wsl2并开启图形界面的方法

    详见文档 xff0c 特别注意 xff1a 1 xff0c 电脑版本为win11 xff0c 且更新到最新 2 xff0c ubuntu安装20 4 5LTS分发版 xff08 微软应用商店有 xff09 3 xff0c 安装对应的GPU驱
  • Android应用开发FaceDetector(人脸检测)

    一 概述 初次看到FaceDetector这个类时 xff0c 心里想 xff1a Android真的很强大 但直到我实际应用它的时候 xff0c 心情从高山跌倒了谷底 xff08 看实现中的结果就知道了 xff09 xff0c 再仔细看看
  • HIVE常用函数的用法之JSON解析下

    HIVE常用函数之JSON TUPLE 如果JSON为空或者为非法的JSON格式 xff0c 返回NULL 如果键Key为空或者不合法 xff08 JSON中不存在 xff09 返回NULL 如果JSON合法 xff0c 键Key也存在 x
  • 时间机器无法存入备份之外的文件的解决方法

    在macOS Big Sur 11 0之后 xff0c APFS 或 APFS 加密磁盘已经替代Mac OS 扩展格式 xff08 日志式 xff09 格式 xff0c 成为时间机器备份磁盘的首选格式 但是Mac将整个APFS宗卷作为时间机
  • ROS安装与报错记录

    ubuntu18 04 安装ros melodic的踩最全的坑的记录 目录 ubuntu18 04 安装ros melodic的踩最全的坑的记录ubuntu 18 04 ros melodic安装记录 ubuntu20 04 ROS noe
  • Eigen3安装、卸载与重装(包含一键卸载安装指令)

    目录 ubuntu中一键卸载安装的 96 sh 96 文件下载链接一 卸载1 查看当前版本2 删除 96 eigen3 96 相关文件二 安装需要的版本1 官网 https gitlab com libeigen eigen release
  • c++调用python

    这里写目录标题 c 43 43 调用python头文件包含初始化python调用具体的函数调用链接CMakeLists txtExamplec 43 43 python的数据类型转化图像数据格式cv Mat传递numpy数据格式转化 一些奇
  • 在ubuntu安装使用miniconda

    目录 miniconda安装使用安装下载更好channel开启虚拟环境 使用一些库安装 miniconda安装使用 安装 下载 span class token function wget span https mirrors tuna t
  • 李群、李代数在SLAM中的应用

    文章目录 李群 李代数李群 李代书与坐标变换的对应关系SE 3 上的李代数求导数左乘扰动 右乘扰动怎么选取用左or右扰动 xff1f SLAM中的使用重投影误差误差项构建对应C 43 43 代码雅克比矩阵frame i的Ti2w从IMU坐标
  • ubuntu 系统安装与问题汇总

    文章目录 ubuntu 系统前期准备系统安装系统安装后显卡驱动问题设置win与ubuntu系统的启动顺序双系统时间问题系统显卡驱动选择意外状况 黑屏无法开机 重刷系统 ubuntu 系统 前期准备 硬盘分区设置BIOS选项 把快速启动关闭把
  • g2o中的核函数

    文章目录 g2o中的核函数RobustKernelHuber函数 g2o中的核函数 作用限制误差较大的edge对最终优化结果的影响 RobustKernelHuber函数 g2o中的class名称 xff1a class RobustKer
  • Eigen库参考博文

    记录一些看过的相关博客的介绍网站 动态大小的矩阵MatrixXd VectorXd
  • Illegal modifier for parameter *** , only final is permitted”

    大家好 xff0c 我想在main函数中定义一个public变量 xff0c 系统报错说 Illegal modifier for parameter chatRoom only final is permitted xff0c 如果把pu
  • C++基础学习

    文章目录 编译内存相关编译变量与内存分区内存分区变量类型 内存对齐内存泄露智能指针include 34 34 和 lt gt 语言对比c 43 43 11自动类型推导lembda 表达式 xff08 匿名函数 xff09 范围for del
  • C++ STL底层实现

    文章目录 STL库的底层实现arrayvectordequelistforward listset mapunordered map unordered set迭代器 STL库的底层实现 顺序容器 array数组vector向量deque双
  • kali爆破WiFi

    kali暴力破解WiFi密码实验步骤 建议在kali的root模式下进行 实验条件 xff1a window7下的VMware装的kali 2020 某宝买的无线 网卡 xff0c 注意 xff0c 有些厂家的网卡不支持Linux系统 xf
  • Nacos全面解析

    目录 一 Nacos概要 1 Nacos简介 2 Nacos安装 3 Nacos配置外部数据源 二 Nacos应用 1 注册发现 2 负载均衡 3 配置中心 4 多环境切换 5 配置刷新 6 共享 扩展配置 7 灰度发布 一 Nacos概要
  • Mysql性能调优

    目录 一 Mysql架构设计 1 Mysql架构图 二 Mysql常见的存储引擎 1 InnoDB引擎 2 MyISAM存储引擎 3 MEMORY存储引擎 三 Mysql索引 1 索引的分类 2 mysql中空值和null的区别 3 mys