
数据库-mysql
文章平均质量分 76
记录mysql相关技术
赶路人儿
一个十年以上编程人员,擅长使用java、python、C++等语言,具有广告投放、个性化推荐引擎等超大规模系统开发经验。
展开
-
Mysql在大表中删除大量数据的优化
假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。如果直接使用delete from tab_name where status=1;会触发lock wait timeout exceed的错误,因为这条语句涉及的记录数太多。执行过程DDL语句,删除整张表和表结构,以及表的索引、约束和触发器。DDL语句,只删除表数据,表的结构、索引、约束等会被保留。DML语句,删除表中数据回滚不可不可可以事务。原创 2023-04-25 11:14:29 · 6211 阅读 · 0 评论 -
Mysql Nested-Loop Join算法和MRR
BNL 主要针对被驱动表关联字段无索引时的优化,(当被驱动表没有索引或索引失效时,无法是用INLJ,mysql就会通过BNL进行优化)如果在EXPLAIN输出中,当Extra值包含Using join buffer(Block Nested Loop)且type值为ALL,index或range时,表示使用BNL;也说明被驱动表的表关联字段缺少索引或索引失效无法有效利用索引。BNL 算法是对 SNLJ 算法的优化,并且可将该算法 BNL 提升至 INLJ 进行优化。原创 2023-03-03 11:06:03 · 1733 阅读 · 0 评论 -
mysql分区表
mysql分区相对于mysql分库分表便利很多,可以对现有的mysql大表添加分区,也可以对已有分区的表扩充分区。值得注意的是我们再用sql查询时,必须加上开始时间和结束时间的查询条件,将查询区间限制到相应的分区,否则会遍历所有分区。分区方法将某张表的数据,分别存储到不同的区域中。每个分区都是独立的表,都要存储该分区数据的数据、索引等信息。使用mysql的分区功能,可以把一个大的数据表分成多个小份,用户不需要区分不同的表名。表中有主键的时候,分区只能使用主键1、KEY 分区,按照某个字段取余原创 2022-03-16 15:10:29 · 967 阅读 · 0 评论 -
mysql主从复制
1、默认主从复制Mysql的复制原理大致如下:主库记录binlog日志:在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志binlog中。主库上的sync_binlog参数控制binlog日志刷新到磁盘。 从库IO线程将主库的binlog日志复制到其本地的中继日志relay log中:从库会启动一个IO线程,IO线程会跟主库建立连接,然后主库会启动一个特殊的二进制转储线程(binlog dump),二进制转储线程会读取主库上binlog中的事件,它不会一直对事件进行轮询,当它追原创 2021-10-11 14:42:29 · 275 阅读 · 0 评论 -
mysql索引优化 & 最左匹配 & 索引下推
联合索引的存储1)联合索引结构:表T1有字段a,b,c,d,e,其中a是主键,除e为varchar其余为int类型,并创建了一个联合索引idx_t1_bcd(b,c,d)。其内容如下:InnoDB首先会使用主键创建一个主键B+树索引和数据文件,此外还会通过联合索引(b,c,d)生成一个索引树,同样是B+树的结构,只不过它的data部分存储的是联合索引所在行的主键值(上图叶子节点紫色背景部分),这里要注意,对于InnoDB存储引擎,辅助索引data部分存储主键值。对于联合索引来说只不过比.原创 2021-05-29 18:16:40 · 1643 阅读 · 3 评论 -
mysql float、decimal类型介绍
一、浮点数:float和double类型表示近似数字数据值(浮点数),前者是单精度mysql用4个字节存储,后者是双精度用8个字节存储。对于浮点数,SQL标准允许在浮点数后跟一个括号来指定精度(以位为单位,而不是指数的范围),例如:float(p)。 mysql也支持此可选的精度规范,float(p)中的精度值仅用于确定存储大小,从0到23的精度导致4字节单精度float列;从24到53的精度导致8字节的双精度double列。mysql还允许使用非标准语法:float(M,D)或real(M,D原创 2020-08-14 11:44:23 · 5212 阅读 · 0 评论 -
在线数据库关系图设计工具 dbdiagram.io
dbdiagram.io是holistics.io这款商业产品的社区版。是一款在线关系型数据库ER图设计系统,特点:使用DSL语言,可以简单快速地创建数据库关系图; Online :不需要安装软件,方便快捷,而且支持拖动和调节,使用Google/github账号登录,可以在线保存设计好的图 Import/Export : 支持导出DDL SQL和PDF,支持导入外部数据 Share : 可以生成一个分享链接,方便团队成员协作语法:1、创建表:Table users { id i原创 2020-06-01 17:57:16 · 5831 阅读 · 0 评论 -
left join整理
一、left join基本语句:我们先看两张表,用户表:mysql> select * from user_test;+----+------+-----+-----+| id | name | sex | age |+----+------+-----+-----+| 1 | 张三 | 1 | 26 || 2 | 王五 | 2 | 30 || 3 | 李四 | 1 | 33 || 4 | 兰儿 | 2 | 30 |+----+------+-原创 2020-05-12 21:05:20 · 8943 阅读 · 1 评论 -
double write buffer——mysql
MySQL的buffer一页的大小是16K,文件系统一页的大小是4K,也就是说,MySQL将buffer中一页数据刷入磁盘,要写4个文件系统里的页。如上图所示,MySQL里page=1的页,物理上对应磁盘上的1+2+3+4四个格。那么,问题来了,这个操作并非原子,如果执行到一半断电,会不会出现问题呢?会,这就是所谓的“页数据损坏”。如上图所示,MySQL内page=1的...转载 2019-12-12 15:02:18 · 3700 阅读 · 6 评论 -
mysql实现distinct限制一列而查多列的方法
假设有表:id name 1 a 2 b 3 c 4 c 5 b我想用一条语句查询得到name不重复的所有数据,如下:select distinct name from table----------name a原创 2018-01-27 17:34:51 · 10718 阅读 · 2 评论 -
mysql 分组内排——group_concat
在大多数应用中,group_concat函数通常用来做行列转换。其实group_concat函数还有一个很重要的功能,就是分组内排序。group_concat完整语法:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])1、基本用法:1)通常,使用GROUP_CONCAT()原创 2018-01-27 17:21:47 · 2134 阅读 · 0 评论 -
mysql组合索引与单列索引
1、组合索引能够避免回表查询:假设有一张订单表(orders),包含order_id和product_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的sql语句:select product_id from orderswhere order_id in (123, 312, 223, 132, 224);这条语句要mysql去根据order_id进行搜索,然后返回原创 2018-01-20 13:23:02 · 1241 阅读 · 1 评论 -
mysql之 double write 浅析
介绍double write之前我们有必要了解partial page write 问题 : InnoDB 的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操作系统,在极端情况下(比如断电)往往并不能保证这一操作的原子性,16K的数据,写入4K 时,发生了系统断电/os crash ,只有一部分写是成转载 2017-12-29 19:13:33 · 918 阅读 · 0 评论 -
mysql导入数据load data infile用法
MySQL导入数据load data infile用法基本语法:load data [low_priority] [local] infile 'file_name txt' [replace | ignore]into table tbl_name[fields[terminated by't'][OPTIONALLY] enclosed by ''][esc转载 2017-03-20 17:12:16 · 1144 阅读 · 0 评论 -
Mysql 如何设置字段自动获取当前时间
问题一:在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间;1、将字段类型设为 TIMESTAMP 2、将默认值设为 CURRENT_TIMESTAMP此时,插入数据后(和自增主键一样,无需制定inc_time字段),mysql会自动将inc_time字段设置成数据库服务器的当前时间。问题二:原创 2017-03-18 14:31:45 · 1712 阅读 · 0 评论 -
Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed
MySQLNonTransientConnectionException: No operations allowed after statement closed 之所以会出现这个异常,是因为MySQL在5以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后,Mysql会自动把这个连接关闭。所以使用连接池的时候虽然连接对象还在但是链接数据转载 2017-03-17 09:44:44 · 7485 阅读 · 0 评论 -
Mysql索引的使用-组合索引+跳跃条件
关于MYSQL组合索引的使用,官方对下面的例子的说法是可以使用索引:KEY(key_part1,key_part2,key_part3)select .... from table where key_part1='xxx' and key_part3='yyy';从MYSQL的执行计划看,确实也是使用索引;但在实际的优化过程中,我们只是简单的关注是否使用了这个索引是不转载 2017-02-28 22:59:59 · 702 阅读 · 0 评论 -
Mysql索引的使用 - 组合索引 + 范围条件的处理
结果是:KEY(key_part1,key_part2,key_part3)select .... from table where key_part1='xxx' and key_part3='yyy'; 在这种情况下,MYSQL只能在索引里处理掉key_par1,而不过在索引里过滤 key_part3的条件,除非 select 后面是 count(*) ;[@more@]这转载 2017-02-28 22:56:47 · 2893 阅读 · 0 评论 -
wait_timeout和interactive_timeout区别
wait_timeout -- 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数interactive_time -- 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接) 对性能的影响:wait_timeout:(1)如果设置大小,那么连接关闭的很快,从而使一些持久的连接不起作用(2)如果转载 2016-08-09 10:40:05 · 789 阅读 · 0 评论 -
percona-toolkit 之 【pt-online-schema-change】说明
背景: MySQL 大字段的DDL操作:加减字段、索引、修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响。在5.1之后随着Plugin Innodb的出现在线加索引的提高了很多,但是还会影响(时间缩短了),主要是出现了MDL锁。不过5.6可以避免上面的情况,但目前大部分在用的版本都是5.6之前的,所以DDL操作一直是运维人员“头疼"的事。那如何在不转载 2016-04-26 10:20:53 · 711 阅读 · 0 评论 -
MySQL在线DDL工具pt-online-schema-change
原理pt-online-schema-change模拟了MySQL内部alter table的方式,但是其操作所更新的是复制表,所以原表不会被锁住。其原理我们通过示例进行解读:shell> pt-online-schema-change –nocheck-replication-filters –recursion-method=none –alter “add newcol int”转载 2016-04-26 10:17:35 · 730 阅读 · 0 评论 -
ERROR 1203 (42000): User root already has more than 'max_user_connections' active connections
同事说MySQL测试服务器超出了最大连接数,要求调整max_connections。mysql> show variables like '%connect%';+--------------------------+-------------------+| Variable_name | Value |+----------转载 2016-04-25 16:57:14 · 8278 阅读 · 0 评论 -
PERCONA-TOOLKIT 工具的安装与使用
Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要包括:1、验证主节点和复制数据的一致性2、有效的对记录行进行归档3、找出重复的索引4、总结 MySQL 服务器5、从日志和 tcpdump 中分析查询6、问题发生时收集重要的系统信息PT安装:yum install -y perl-CPAN perl-Time-Hi转载 2016-04-24 13:13:02 · 1093 阅读 · 0 评论 -
percona-toolkit 之 【pt-online-schema-change】说明
背景: MySQL 大字段的DDL操作:加减字段、索引、修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响。在5.1之后随着Plugin Innodb的出现在线加索引的提高了很多,但是还会影响(时间缩短了),主要是出现了MDL锁。不过5.6可以避免上面的情况,但目前大部分在用的版本都是5.6之前的,所以DDL操作一直是运维人员“头疼"的事。那如何在不转载 2016-04-24 13:11:16 · 1814 阅读 · 0 评论 -
Mysql全局ID生成方法
生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标;在单表/数据库数据量过大,更新量不断飙涨时,MySQL DBA往往会对业务系统提出sharding的方案。既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下转载 2016-02-21 14:05:06 · 1029 阅读 · 0 评论 -
mysql 每秒钟查询次数、插入次数、删除次数、更新次数的统计
--show global status where Variable_name in('com_select','com_insert','com_delete','com_update');查询出当前四种操作的总次数x1y1z1w1--select sleep(60)延时60秒--show global status where转载 2015-12-31 14:24:13 · 3366 阅读 · 0 评论 -
mysql自定义函数field
MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1、str2、str3、str4比较,返回1、2、3、4,如遇到null或者不在列表中的数据则返回0. 这个函数好像Oracle中没有专门提供(也可能是我没有用到),不过自己实现这样一个函数还是比较简单的。mysql> select * from 表名 or原创 2015-12-31 09:44:14 · 1546 阅读 · 0 评论 -
mysql5.7版本问题
1、mysql5.7版本中有一个bug,当除数为0,进行查询时始终会报ERROR 1365 (22012): Division by 0 错误。无论设置sql_mode与否,都不起作用。而相同的sql在5.6版本上就不会出现错误。 https://www.digitalocean.com/community/tutorials/how-to-prepare-for-your-mysql-5-原创 2015-12-18 18:33:54 · 2361 阅读 · 0 评论 -
解析sql_mode
MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制服务器的操作模式。模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查。这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使用MySQL。你可以用--sql-mode="modes"选项启动mysqld来设置默认SQL模式。如果你想转载 2015-12-18 16:41:11 · 912 阅读 · 0 评论 -
mysql 字符串定位、字符串截取
1、locate函数可以实现类似indexof的功能,locate(substr,str)返回substr子串在字符串str中的位置。2、substring函数,截取字符串:substring(str, pos) substring(str, pos, length) 说明:substring(被截取字段,从第几位开始截取) substring(被截取字段,从第几位开始原创 2015-12-17 15:01:55 · 11254 阅读 · 1 评论 -
使用atomikos处理ActiveMQ在Spring环境的XA事务
ActiveMQ完全遵循jms规范,而jms是支持事务的,即要么全部成功,要么全部失败。很多时间,我们的JMS操作需要和数据库操作的事务一致,即要么jms和数据库操作都成功,要么jms和数据库操作都失败,这就是分布式事务(xa事务, 也就是所谓的两段式提交事务,在java中的编程接口为JTA)的用武之地。完美实现j2ee规范的web server是提供对JTA的实现的,但是tomcat,jet转载 2015-11-25 15:47:24 · 2193 阅读 · 0 评论 -
c3p0连接池,当数据源不可用时 自动跳过
最近在一个项目中出现一个问题:系统使用spring+c3p0管理数据库的连接池,项目中一共用到了4个数据源。在启动项目时,如果其中有某一个或几个数据源连不上时,后台就会无限次尝试连接,导致整项目无法启动。而实际上,我们想要的结果是,如果某个数据源无法连接使用时,跳过该数据源的连接,继续加载下面的项目。于是查了一下c3p0连接池配置,发现经过如下配置后即可达到理想的效果。在数据源原创 2015-11-18 14:29:45 · 1808 阅读 · 0 评论 -
查看文章 mysql:表注释和字段注释
参考文档不太给力啊,表注释和字段注释的资料不全。1 创建表的时候写注释create table test1( field_name int comment '字段的注释')comment='表的注释'; 2 修改表的注释alter table test1 comment '修改后的表的注释'; 3 修改字段的注释转载 2015-11-09 09:41:25 · 609 阅读 · 0 评论 -
mysql 用户表中多个host时的匹配规则
mysql数据库中user表的host字段,是用来控制用户访问数据库“权限”的。可以使用“%”,表示所有的网段;也可以使用具体的ip地址,表示只有该ip的客户端才可以登录到mysql服务器;也可以使用“_”进行模糊匹配,表示某个网段的客户端可以登录到mysql服务器。如果在user表中存在一个用户两条不同host值的记录,那么mysql服务器该如何匹配该用户的权限呢?原创 2015-11-02 10:53:03 · 9729 阅读 · 2 评论 -
mysql中or和in的效率问题
在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看《mysql数据库开发的36条军规》的文章,里面提到了or和in的效率问题,文中提到or的效率为O(n),而in的效率为O(logn), 当n越大的时候效率相差越明显。今天刚好有时间决定对心中的疑惑进行测试,下面是详细的测试过程。第一步,创建测试表,并生成测试数据,测试数据为1000万条记录。数据库版本为5.1转载 2015-10-30 10:10:23 · 1133 阅读 · 0 评论 -
Mysql 分组聚合实现 over partition by 功能
mysql中没有类似oracle和postgreSQL的 OVER(PARTITION BY)功能. 那么如何在MYSQL中搞定分组聚合的查询呢先说结论: 利用 group_concat + substr等函数处理例如: 订单表一张, 只保留关键字段iduser_idmoneycreate_time1150转载 2015-10-10 13:57:51 · 1443 阅读 · 0 评论 -
MySQL中SELECT+UPDATE并发更新问题
假设MySQL数据库有一张会员表vip_member(InnoDB表),结构如下(uid,start_at,end_at,updated_at,active_status) 当一个会员想续买会员(只能续买1个月、3个月或6个月)时,必须满足以下业务要求:如果end_at早于当前时间,则设置start_at为当前时间,end_at为当前时间加上续买的月数如果end_at等于或晚于转载 2015-10-09 17:34:46 · 2410 阅读 · 0 评论 -
Mysql 命令行控制事务
1、创建表CREATE TABLE `t1` ( `a` int(11) NOT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`)) ENGINE=InnoDB DEFAULT CHARSET=latin1; 2、查看mysql系统级别的事务隔离级别: mysql> SELECT @@global.tx_i转载 2015-10-09 15:43:38 · 2252 阅读 · 0 评论 -
mysql聚合函数rollup和cube
一、with rollup:with rollup 通常和group by 语句一起使用,是根据维度在分组的结果集中进行聚合操作。——对group by的分组进行汇总。假设用户需要对N个纬度进行聚合查询操作,普通的groupby语句需要N个查询和N次group by操作。而rollup的有点是一次可以去的N次groupby的结果,这样可以提高查询效率,同时大大减少网络的传输流量。1、r...原创 2015-10-08 11:33:54 · 21178 阅读 · 8 评论 -
mysql数据库字符编码选择导致的异常——\xE5\x8C\x97\xE4\xBA\xAC' for column
在创建数据库时,由于没有指定编码(utf-8),在web系统中执行sql(存储过程...)会报如下错误:18:57:05,070 ERROR DirectionalCodeController:139 - org.springframework.jdbc.UncategorizedSQLException: ### Cause: java.sql.SQLException: Incor原创 2015-09-29 19:00:17 · 8903 阅读 · 0 评论