• [问题求助] 使用Benchmarksql测试工具,登录Benchmarksqlce客户端,向MySQL数据库服务器导入数据(创建表并初始化)
    【功能模块】【操作步骤&问题现象】1、根据文档中Benchmarksql测试指导,配置好Benchmarksql环境之后,登录mysql数据库服务器2、创建数据库tpcc修改配置文件之后,向MySQL数据库服务器导入数据,执行./runBenchmark.sh my_mysql.properties命令加载数据,出现一系列问题,如下图【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 登录Benchmarksql客户端,向MySQL数据库服务器导入数据出现通信线路故障问题
    【功能模块】【操作步骤&问题现象】1、在Benchmarksql的run目录下执行命令给文件赋予可执行权限。2、加载数据执行./runDatabaseBuild.sh my_mysql.properties命令出现问题【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] MySQL账号登录ip验证机制
    问题我们通过mysql客户端登录MySQL服务器的时候,基本都是使用的命令 mysql -hxxx.xxx.xxx.xxx -uxxx -pxxxxxx 进行访问的。但是我们可能会遇到这样的情况,我们明明输入的是正确的密码。但是就是登录不上,服务端却返回了ERROR 1045 (28000): Access denied for user xxx 之类的报错,但是换一个机器使用mysql客户端就可以登录上mysql服务器。前后两次输入的命令都是一样的,用户名和密码都是一样的。为什么一个机器可以登录MySQL服务器,另外一个却不可以呢。唯一的区别就是使用不同的机器,难道访问MySQL服务器还是认机器的吗?分析说对了,访问MySQL服务器还真的是认机器的。MySQL的账号信息是存放在mysql.user这个系统表里面的。以mysql5.7为例,查看一下mysql.user这张系统表。发现它是一张有主键表,主键列有两个User和Host,是复合主键。因此mysql.user表里面可以是有多条记录的User列是相同。猜测MySQL的登录认证的时候是User 和 Host 两个维度的,但是我们使用mysql客户端的时候我们只通过 -u和-p参数输入了User和Password信息。在登录的时候,MySQL到底是使用mysql.user表的哪一行记录进行认证的呢?对应的优先级又是怎样的呢?做一个简单的试验验证一下。试验在MySQL服务器(ip为 10.xxx.xxx.133)上新建多个用户,用户名相同,host和密码不同;语句如下。(注,xxx.xxx.是固定的ip前缀,如192.168.)create user 'drs_user' identified by 'drs_pwd_0'; create user 'drs_user'@'127.0.0.1' identified by 'drs_pwd_1'; create user 'drs_user'@'localhost' identified by 'drs_pwd_2'; create user 'drs_user'@'xxx.xxx.218.181' identified by 'drs_pwd_3' create user 'drs_user'@'xxx.xxx.218.%' identified by 'drs_pwd_4'查看mysql.user系统表如下mysql> select user, host from mysql.user where user = 'drs_user'; +----------+-----------------+ | user | host | +----------+-----------------+ | drs_user | % | | drs_user | xxx.xxx.218.% | | drs_user | xxx.xxx.218.181 | | drs_user | 127.0.0.1 | | drs_user | localhost | +----------+-----------------+准备三个vm作为访问MySQL的客户端,ip分别为’xxx.xxx.218.181’,‘xxx.xxx.218.42’和’xxx.xxx.219.30’.分别使用drs_user进行登录验证在’xxx.xxx.218.181’上> mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_0 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.181' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_1 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.181' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_2 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.181' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_3 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 17545 Server version: 5.7.26-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>此时MySQL服务器使用的是 (drs_user | xxx.xxx.218.181)这一行进行登录认证的在’xxx.xxx.218.42’上> mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_0 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.42' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_1 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.42' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_2 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.42' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_3 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'drs_user'@'xxx.xxx.218.42' (using password: YES) > > mysql -h10.xxx.xxx.133 -udrs_user -pdrs_pwd_4 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 17545 Server version: 5.7.26-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>此时MySQL服务器使用的是 (drs_user | xxx.xxx.218.%)这一行进行登录认证的在’xxx.xxx.219.30’上>mysql -hxxx.xxx.xxx..133 -udrs_user -pdrs_pwd_0 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 17694 Server version: 5.7.26-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>此时MySQL服务器使用的是 (drs_user | %)这一行进行登录认证的结论参考官方文档(https://dev.mysql.com/doc/refman/5.7/en/connection-access.html)的描述:简而言之:MySQL 对于同一个User,会根据 Host 的匹配精度按降序排列,当客户端尝试登录 MySQL 的时候,会按照顺序依次这个 User下面所有的 Host 规则,采用最小匹配直到匹配成功。
  • [技术干货] MySQL数据表操作
    1. 创建数据库#链接mysql数据库后,进入mysql后可以操作数据 # 1. 创建库 create database if not exists mysqldefault charset=utf8;  #1. 数据库 tlxy 如果不存在则创建数据库,存在则不创建 # 2. 创建 mysql数据库,并设置字符集为utf8 #3. 无特殊情况都要求字符集为utf8或者utf8mb4的字符编码2 查看所有库 #1. 查看所有库 show databases;3 打开库/进入库/选择库 #use 库名 use mysql4 删除库#删库有风险,动手需谨慎。#删除库,那么库中的所有数据都将在磁盘中删除。 drop database 库名数据表操作 创建表create table 表名(字段名,类型,【字段约束】,。。。);以下创建一个 users 的表 create table users( 创建ID字段,为正整数,不允许为空 主键,自动递增 id int unsigned not null primary key auto_increment, 创建 存储 名字的字段,为字符串类型,最大长度 5个字符,不允许为空 username varchar(5) not null, 创建存储 密码 的字段,固定长度 32位字符, 不允许为空 数据库在存储用户密码时通常存储的是加密后的密码 使用md5加密算法后 密码均为32位 所以这里固定长度为32 password char(32) not null, 创建 年龄 字段,不允许为空,默认值为 20 age tinyint not null default 20 )engine=innodb default charset=utf8; 查看表结构 desc users; 查看建表语句 show create table users;创建表的基本原则:表名和字段名 尽可能的符合命名规范,并且最好能够‘见名之意’表中数据必须有唯一标示,即主键定义。无特殊情况,主键都为数字并自增即可表中字段所对应的类型设置合理,并限制合理长度表引擎推荐使用innodb,并无特殊情况都要求为utf8或者utf8mb4的字符编码修改表结构alter table 表名 action (更改的选项)# 语法:alter table 表名 add 添加的字段信息 # 在 users 表中 追加 一个 num 字段 alter table users add num int not null; # 在指定字段后面追加字段 在 users 表中 age字段后面 添加一个 email 字段 # 由于数据一开始没有email字段 添加后会设置默认值 空字符串 alter table users add email varchar(50) after age; # 在指定字段后面追加字段,在 users 表中 age字段后面 添加一个 phone alter table users add phone char(11) not null after age; # 在表的最前面添加一个字段 alter table users add aa int first;删除字段# 删除字段 alter table 表名 drop 被删除的字段名 alter table users drop aa;修改表名alter table 原表名 rename as 新表名更改表中自增的值在常规情况下,auto_increment 默认从1开始继续递增alter table users auto_increment = 1000;参考文章:https://juejin.cn/post/6979016655011594270#heading-33
  • [技术干货] MySQL中的binlog简单查看
    DRS数据迁移DRS做数据迁移有两个阶段,初始化阶段,和增量阶段初始化就是把表中的存量数据从源端迁移到目标端去,增量阶段就是从源端实时拉取binlog并解析成SQL,并在目标端执行,以达到实时同步的目的binlog参数配置1、binlog开关MySQL中可以配置增量日志binlog,来保存实例上的数据变更,可能通过参数sql_log_bin来控制,其中on表示开启mysql> show variables like '%sql_log_bin%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_log_bin | ON | +---------------+-------+2、binlog格式binlog记录格式有两种,statement/row,其中statment记录SQL格式,row格式记录每行的变更内容,控制格式的参数有三种,statement/mix/row,其中mix表示两者的混合mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+3、row格式的binlog的镜像有两种,full和minimal,其中full情况下,即使某一列未发生变化也会把变化前变化后的值内容记录下来,而minimal则不会mysql> show variables like '%binlog_row_image%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | binlog_row_image | FULL | +------------------+-------+4、对于从主库复制过来的binlog是否记入本地binlog中,可以通过参数log_slave_updates来控制mysql> show variables like '%log_slave%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | log_slave_updates | ON | +-------------------+-------+通过MySQL连接查看binlog1、可以通过show master status来查看当前写入的binlog的位点,其中file表示下一个binlog的bytes内容即将写入的文件名position表示下一个binlog的bytes内容写入到file中的位点的起点(byte字节数)Binlog_Do_DB表示需要记录binlog的库名列表,也就是白名单Binlog_Ignore_DB表示需要忽略的binlog的库名列表,也就是黑名单Executed_Gtid_Set表示本库中已经执行完的全局事务的id集合mysql> show master status; +---------------+-----------+--------------+------------------+-------------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+-----------+--------------+------------------+-------------------------------------------------+ | binlog.000049 | 392867987 | | | dac56362-4d8e-11ea-ad85-6805caaf2dbd:1-18828368 | +---------------+-----------+--------------+------------------+-------------------------------------------------+2、binlog列表,表示本地保存的binlog及其大小(byte字节数)mysql> show binary logs; +---------------+------------+ | Log_name | File_size | +---------------+------------+ | binlog.000048 | 107816 | | binlog.000049 | 392966547 | +---------------+------------+3、预览binlog内容,命令内容中in后面为binlog的文件名from为byte数偏移量limit为需要读取的binlog的event数量event内容中pos为本event的byte在binlog文件中的偏移量end_log_pos为下一个event的偏移量event_type为event类型server_id为MySQL的idinfo为binlog内容mysql> show binlog events in 'binlog.000048' from 1226 limit 4; +---------------+------+------------+-----------+-------------+-----------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +---------------+------+------------+-----------+-------------+-----------------------------------------------------------------------------------+ | binlog.000048 | 1226 | Query | 123453310 | 1294 | BEGIN | | binlog.000048 | 1294 | Table_map | 123453310 | 1421 | table_id: 109 (drs_global_83cb2e89_0ca8_45d3_bb1d_81a07429fac1.trep_commit_seqno) | | binlog.000048 | 1421 | Write_rows | 123453310 | 1483 | table_id: 109 flags: STMT_END_F | | binlog.000048 | 1483 | Xid | 123453310 | 1514 | COMMIT /* xid=38 */ | +---------------+------+------------+-----------+-------------+-----------------------------------------------------------------------------------+通过文件来查看binlog1、MySQL连接查看到的binlog内容比较简略,要想查看具体内容,可以通过mysqlbinlog命令来查看,–start-position为读取起点偏移量,–stop-position为读取截止点的偏移量,-vv为解析出来内容,后面跟需要查看的binlog文件名> mysqlbinlog --start-position=1226 --stop-position=1514 -vv binlog.000048 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #210816 9:37:19 server id 123453310 end_log_pos 123 CRC32 0x7430aae7 Start: binlog v 4, server v 5.7.22-log created 210816 9:37:19 at startup ROLLBACK/*!*/; BINLOG ' T8EZYQ9+v1sHdwAAAHsAAAAAAAQANS43LjIyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABPwRlhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA AeeqMHQ= '/*!*/; # at 1226 #210819 18:05:50 server id 123453310 end_log_pos 1294 CRC32 0xdf37b623 Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1629367550/*!*/; SET @@session.pseudo_thread_id=4/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1436549152/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb4 *//*!*/; SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 1294 #210819 18:05:50 server id 123453310 end_log_pos 1421 CRC32 0x768dcfe8 Table_map: `drs_global_83cb2e89_0ca8_45d3_bb1d_81a07429fac1`.`trep_commit_seqno` mapped to number 109 # at 1421 #210819 18:05:50 server id 123453310 end_log_pos 1483 CRC32 0x9eccabe0 Write_rows: table id 109 flags: STMT_END_F BINLOG ' /iweYRN+v1sHfwAAAI0FAAAAAG0AAAAAAAEAL2Ryc19nbG9iYWxfODNjYjJlODlfMGNhOF80NWQz X2JiMWRfODFhMDc0MjlmYWMxABF0cmVwX2NvbW1pdF9zZXFubwANAwgC/g8I/AMSDxIS/Av+A4AB BACAAQAABP4f6M+Ndg== /iweYR5+v1sHPgAAAMsFAAAAAG0AAAAAAAEAAgAN///49gAAAAD/////////////mapmoXKZqmah cuCrzJ4= '/*!*/; ### INSERT INTO `drs_global_83cb2e89_0ca8_45d3_bb1d_81a07429fac1`.`trep_commit_seqno` ### SET ### @1=0 /* INT meta=0 nullable=0 is_null=0 */ ### @2=-1 (18446744073709551615) /* LONGINT meta=0 nullable=1 is_null=0 */ ### @3=-1 (65535) /* SHORTINT meta=0 nullable=1 is_null=0 */ ### @4=NULL /* STRING(3) meta=65027 nullable=1 is_null=1 */ ### @5=NULL /* VARSTRING(384) meta=384 nullable=1 is_null=1 */ ### @6=NULL /* LONGINT meta=0 nullable=1 is_null=1 */ ### @7=NULL /* LONGBLOB/LONGTEXT meta=4 nullable=1 is_null=1 */ ### @8=NULL /* INT meta=0 nullable=1 is_null=1 */ ### @9='2021-08-19 10:05:50' /* DATETIME(0) meta=0 nullable=1 is_null=0 */ ### @10=NULL /* VARSTRING(384) meta=384 nullable=1 is_null=1 */ ### @11=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */ ### @12='2021-08-19 10:05:50' /* DATETIME(0) meta=0 nullable=1 is_null=0 */ ### @13=NULL /* LONGBLOB/LONGTEXT meta=4 nullable=1 is_null=1 */ # at 1483 #210819 18:05:50 server id 123453310 end_log_pos 1514 CRC32 0x0544c8e9 Xid = 38 COMMIT/*!*/; SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;2、拉取远程binlog下载其中read-from-remote-server表示要从远程拉取binlograw表示不解析内容to-last-log表示拉取直到最后一个binlog文件> mysqlbinlog -h192.168.12.126 -uroot -P3306 -phuawei --raw --read-from-remote-server binlog.000048 --to-last-log > ls binlog.000048 binlog.000049 binlog.000050
  • [问题求助] 【GaussDB(for MySQL)产品】【数据库连接功能】学习使用GaussDB过程中,无法连接到数据库
    【功能模块】本人学习使用GaussDB的过程中,按照帮助文档想在本地的Java项目中使用JDBC连接数据库,但是怎么都连接不上【操作步骤&问题现象】1、没有购买弹性云服务器,所以想用内网连接。第一步在java项目中添加依赖2、根据帮助文档,在项目中增添类,写连接接口备注:根据文档,我所写的URL中:192.168.0.84:是所购买实例后,实例的内网读写IP地址3306:该实例开放的端口号foruser:我创建的数据库数据库:附:数据库的用户管理:3、开放端口号。我在数据库实例绑定的虚拟私有云增加安全组规则:4、测试连接数据库:【截图信息】连接不上报错信息注:用户密码我写了备忘录,创建的时候密码还有在java后端写的password都是是复制粘贴的,所以不可能出现错误我根据文档做了以上努力,目前找不到错误原因,求告知有做的不正确的地方!!或者错误原因!!感谢!!!
  • [优秀博文] GaussDB(for MySQL)如何快速创建索引?华为云数据库资深架构师为您揭秘
    导读:云服务环境下,如何解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战。华为云GaussDB(for MySQL)通过引入并行创建索引技术,很好地解决了批量索引创建和临时添加索引等性能瓶颈问题,帮助用户更快建立好索引。想要进一步了解快速创建索引的秘诀,请不要错过本文。关于MySQL索引       我们都知道,数据库使用索引技术加快数据的查询。MySQL数据库也支持若干种索引结构提高查询的性能(参见MySQL文档:https://dev.mysql.com/doc/refman/8.0/en/create-index.html),其中使用最广泛的是B+tree索引,因为B+tree索引在查询和修改的性能之间有很好的平衡,同时其存储和维护的代价也是比较优的。       MySQL的表本身由聚簇索引(必须是B+tree索引)表示,再加上若干个二级索引,包括B+tree索引,共同组成一个MySQL的独立表,可以说MySQL的表是由一组索引共同组成的。我们都知道索引是一把双刃剑,充分的索引可以更好地提升可以适配的查询的性能,但是需要维护这些索引使得其和数据同步,所以在数据修改操作阶段,更多的索引也会带来更高的开销。索引创建与否的权衡通常是动态的,用户不一定能做到在表定义之初就知道需要建立哪些索引,需要随着业务的发展变化而调整索引,这也带来了动态索引创建的一些问题。 MySQL的索引创建逻辑       我们先看一下MySQL索引创建的逻辑。首先,MySQL索引的创建可以使用两种不同的DDL(Data Definition Language: 数据定义语言)算法来实现。第一种是COPY算法,它非常低效,就是在两个表之间进行数据拷贝,来完成表结构相关的修改,尤其是它要求加表锁,现在基本不使用了。第二种是INPLACE算法,该算法不要求加锁,因此很多DDL操作是不阻塞DML(Data Manipulation Language: 数据操纵语句)操作的,比如创建索引。该算法具体的实现在存储引擎层面完成,可以进行更多的优化。实际上DDL语句还有一种INSTANT算法,但是它无法支持创建索引操作,这里不展开介绍。       对于INPLACE算法,在5.7版本之前,是采用索引记录不断地向建好的空索引插入的方式。由于插入的数据的无序性,该方法导致了明显的性能问题和潜在的空间浪费。在5.7版本以后,MySQL优化了建索引步骤,将其改进为对已排序的索引记录进行自底向上批量插入并且紧凑拼装的创建方式,如果有多个索引要创建,会单独对每个索引执行相同的算法。新的算法会经历读取数据、排序数据和创建索引这几个主要步骤。       总体而言,创建索引这类DDL操作,会比普通的DML等操作要费时,而该类DDL耗时会导致用户在继续动态添加索引加速查询的时候,需要等待很长的时间,极大影响业务;而且用户的MySQL实例开启了Binlog复制,耗时的DDL操作容易引起备库的长时间落后。MySQL的创建索引流程图云化场景下索引创建的问题       随着越来越多用户把数据托管在云服务上,以及用户数据量的不断增长,前述的动态添加索引导致的问题非常影响用户体验。同时客户的单表数据逐渐达到几TB甚至几十TB,客户对创建索引太慢所带来的性能问题的抱怨越来越多,尤其是创建索引周期如果太长,我们可能很难找到一段合适的业务低峰期来动态创建索引,避免业务的波动。因此,如何在云服务环境下,解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战。       在云化场景下,还有一个主要场景对客户的体验非常重要。我们知道客户的业务要迁移上云,需要对数据进行大规模的迁移(华为云提供了数据复制服务DRS工具支持各类数据迁移场景),数据迁移比较高效的方式为:逻辑导出源端数据在目标端建表(注意,表不含二级索引)将源端导出的数据插入到目标端对目标端的表建立二级索引       如果涉及动态数据同步,相关步骤会更复杂一些,由于和该主题无关,这里不展开。以上步骤中,需要重点注意的是步骤2和4,在目标端创建表的时候先不创建二级索引。这个优化对性能影响很大,尤其是一个表有很多二级索引的场景。我们知道Btree索引的插入如果是有序的,对插入性能和结果的空间利用率是最好的,因为Btree索引的分裂会在插入区域的尾部产生,同时由于分裂算法的优化,分裂产生的页面填充率会比较高;相反地,如果是随机插入,尤其是并发地随机插入,很容易导致Btree索引在不同的节点进行分裂,并且分裂后的页面填充率都处于一个半满的状态,导致Btree最终的一个膨胀。 有了这个背景之后,我们就容易理解上面的问题,插入表数据的时候,我们屏蔽了二级索引,等所有数据都准备好了,再采用批量建立索引的方式创建二级索引,这对于二级索引创建效率是最高的。如果不这么做,每插入一条记录,就要去插入相应的二级索引,那么二级索引就是一个无序的随机插入,并发起来性能会变差很多。       虽然在数据同步准备好后,批量创建二级索引是一个有效的方案,但是如果数据量很大,这么创建二级索引还是非常耗时,导致客户在数据迁移完之后需要等待很长时间才能开展业务,这个等待周期可能是小时甚至天级别的。虽然可以考虑表级别的并发创建索引,但是这个方法也有明显的缺点:应用场景有限,要求有多表;以及表和表之间的并发其实不是一个最有效的并发形式,相互影响比较大。GaussDB(for MySQL)如何快速创建索引?       综上所述,在创建索引这个点上存在两个性能瓶颈点:一个是用户迁移数据之后的批量索引创建;第二个是用户临时需要添加一个二级索引。无论哪个点,我们都需要更快的建立好索引,提升用户的使用体验。       华为云GaussDB(for MySQL)引入了并行创建索引的技术,它改进了社区版MySQL创建索引只用单线程的问题,以此提高创建索引的效率,并一起解决了前述两个痛点。前面提到的社区版创建索引逻辑是单线程的,首先存在资源利用率不够饱满的问题;其次创建索引过程是CPU和IO开销交替进行的过程,在做一个操作的时候,即使不是资源竞争的操作也只有等待。多线程创建索引可以充分利用CPU和IO资源,同时有的线程在做CPU计算时,别的线程可以并发的做IO操作。       GaussDB(for MySQL)使用的并行创建索引,是一个全链路的并行技术。前面提到,创建索引包含了若干个阶段,我们的并行创建算法,对这里的每个阶段都做并行处理,从读取数据、排序、到创建索引,都是并行操作,每一步都由指定的N个线程并发处理。它的逻辑如下图所示:       GaussDB(for MySQL)尤其对数据的归并排序做了多种优化,使得我们常规的归并排序能够充分的并行,充分利用CPU、内存和IO的资源。在并行创建索引之后的合并步骤,也使用了一套简化的算法,正确处理各种索引结构的场景。支持的索引和场景       GaussDB(for MySQL)的并行创建索引功能,目前支持的索引为Btree二级索引。对于virtual index二级索引,将会在不久的将来提供全面的支持,而MySQL的spatial index和fulltext index不在该并行创建索引覆盖范围内。       特别要注意的是,主键索引的创建目前也是不支持并行的,因此如果一个并行创建索引的SQL语句包含创建主键索引,或者前面提及的spatial index与fulltext index,那么客户端将会收到一个告警,提示该操作不支持并行创建索引,同时该语句会采用单线程创建索引的方式执行完成。       从SQL语句的角度,如前所述,创建索引可以采用不同的算法,由于COPY算法(ALGORITHM=COPY)不是采用批量插入的方式,因此不会受益于该并行创建索引优化。而对于INPLACE算法,如果创建索引用的是非rebuild的方式,都可以受益于该优化;一旦需要使用rebuild的方式创建索引,因为涉及到主键索引的建立,将无法使用并行创建索引的算法。示例下面我们通过几个实例来了解一下如何使用并行创建索引算法加快创建速度,以及我们的条件约束是如何生效的。1. 我们使用sysbench的表,表内有1亿条数据2. 在该表的k字段建索引,采用社区默认单线程,耗时82s3. 通过设置innodb_rds_parallel_index_creation_threads = 4启用4个线程建索引,可以看到建索引耗时72s,速度提升3.79倍4. 假设我们要修改主键索引,虽然指定了多线程,但是会收到一个warning,实际上只能通过单线程建索引注意事项 首先对innodb_rds_parallel_index_creation_threads这个参数进行一下说明,它控制了系统中所有并行DDL可以使用的总线程数,取值范围是[1-128]。该参数取值为1表示使用原始的单线程创建索引,取值为N,表示接下来的DDL使用N个线程创建。如果一个DDL使用了100个线程在执行,那么另外一个也要使用并行的DDL且最多只能使用剩下的28个线程;而如果128个线程都被并行DDL语句占用了,新来的DDL只能走原始的单线程创建的逻辑。 虽然该并行创建索引加快了索引的创建速度,但是在具体使用场景下,还是需要有审慎的评估。我们知道在并行算法应用之后,该DDL对硬件资源的使用会尽可能的充分,这也意味着其它操作就得不到太多的资源了。因此,针对不同的场景需要具体地分析,它决定了我们如何创建索引。 对于迁移场景,由于这时候还没有任何业务接入,用户希望尽快完成所有索引的创建,因此可以尽量设置多线程数,比如我们是16核规格的实例,那么我们就可以把并行线程的数量指定为16,加速完成操作。 如果是用户业务运行阶段要创建索引,我们还是不希望DDL操作,对正在运行的业务如DML操作等有太多的影响。因此,这时候创建索引可以指定相对少一些的线程数量,比如2-4(或者根据CPU规格以及负载决定,同时不鼓励并发地执行多个DDL操作)。这样既能相对地加速创建索引的进程,也能保证DML的正常进行。         综上所述,GaussDB(for MySQL)支持了并行创建索引,通过缩短创建索引使用的时间,很好地解决了客户关切的两类问题,提升了客户的体验。但技术无止境,在创建索引领域,还有其它的问题需要我们优化解决,例如如何减少创建索引步骤对IO的影响等等。我们后续会针对这些点进行优化,给客户带来更多的惊喜。       目前,华为云GaussDB(for MySQL) 并行创建索引优化功能已上线,欢迎大家前往华为云官网体验:https://www.huaweicloud.com/product/gaussdb_mysql.html 附:华为云GaussDB(for MySQL)内核专家系列文章华为海外女科学家为您揭秘:GaussDB(for MySQL)云栈垂直集成的力量有多大?华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?
  • [交流吐槽] mysql字段名及字段配制合理性
    剔除关系不密切的字段字段命名要有规则及相对应的含义(不要一部分英文,一部分拼音,还有类似a.b.c这样不明含义的字段)字段命名尽量不要使用缩写(大多数缩写都不能明确字段含义)字段不要大小写混用(想要具有可读性,多个英文单词可使用下划线形式连接)字段名不要使用保留字或者关键字保持字段名和类型的一致性慎重选择数字类型给文本字段留足余量
  • [技术干货] Mysql 中 MyISAM 和 InnoDB 的区别以及选择
    区别:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;如何选择:是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。系统奔溃后,MyISAM恢复起来更困难,能否接受;MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
  • [问题求助] abc平台中的对象管理是mysql吗&FDI;数据集成目标数据源设置成abc平台的对象管理 救急!!!
    这个是mysql嘛,如果是的话我可以用Navicat连接吗,url 和账户密码改去哪里查看吖,如果不是mysql或者用其他的数据源,我该怎么连接啊我现在的目的就想把目标数据源设置成abc平台的对象管理,有没有大佬指点一二,救急救急~~~
  • [基础组件] 【MRS】【Spark-shell功能】使用spark-shell去读mysql中的数据失败
    【功能模块】MRS 8.0.2混合云版本   Spark 组件  spark-shell功能模块【操作步骤&问题现象】1、进入MRS客户端,source环境变量后完成用户kinit认证2、执行命令启动spark-shell:spark-shell --jars /opt/bdos/bdos-runner-server/lib/mysql-connector-java-8.0.21.jar3、执行命令读取mysql数据:val a = spark.read.format("jdbc").option("url", "jdbc:mysql://172.16.149.167:3306/test").option("query", "select id from test").option("user", "root").option("password", "AHiXitVt6f3gmW3JQII=").option("driver", "com.mysql.jdbc.Driver").load()【截图信息】
  • [交流吐槽] MySQL触发器简单实例
    CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。{ INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。<触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
  • [交流吐槽] MySQL支持的分区类型
    RANGE分区: 这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区LIST分区: 这种模式允许系统通过预定义的列表的值来对数据进行分割。按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。HASH分区 :这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。KEY分区 :上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
  • [技术干货] 分区表的限制因素
    一个表最多只能有1024个分区MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。分区表中无法使用外键约束MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。
  • [交流吐槽] MySQL联合索引
    联合索引是两个或更多个列上的索引。对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a   、    a,b   、  a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
总条数:1406 到第 页
上滑加载中