随笔分类 -  mysql

摘要:一、MySQL 为日期增加一个时间间隔:date_add()。 1、 示例: set @dt = now(); select date_add(@dt, interval 1 day); - 加1天 select date_add(@dt, interval 1 hour); -加1小时 selec 阅读全文
posted @ 2023-08-21 15:14 ppjj 阅读(3125) 评论(0) 推荐(0)
摘要:MySQL事务的ACID,其中(C)一致性是最终目的。 保证一致性的措施有: A原子性:靠undo log来保证(异常或执行失败后进行回滚)。 D持久性:靠redo log来保证(保证当MySQL宕机或停电后,可以通过redo log最终将数据保存至磁盘中)。 I隔离性:事务间的读写靠MySQL的锁 阅读全文
posted @ 2022-08-17 16:43 ppjj 阅读(357) 评论(0) 推荐(0)
摘要:innodb 通过buffer pool, logBuffer, Redo Log, Undo Log 来实现事务的, 以update语句举例: innodb 在收到一个update语句后, 会先根据条件找到数据所在的页, 并将该页缓存在buffer pool中 执行update语句, 修改buff 阅读全文
posted @ 2022-08-17 16:38 ppjj 阅读(342) 评论(0) 推荐(0)
摘要:之前我们了解了一条查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条 SQL 更新语句的执行流程又是怎样的呢? 首先我们创建一个表 user_info,主键为 id,创建语句如下: Copy 阅读全文
posted @ 2022-03-19 09:43 ppjj 阅读(102) 评论(0) 推荐(0)
摘要:InnoDB是行锁还是表锁取决于SQL语句,行锁是实现在索引上的,而不是锁在物理行记录上,如果没有命中索引,相当于没有索引,则升级为表锁。行锁不容易被发现,比较狡猾,因为它超时时间是50秒,可以通过ER_LOCK_WAIT_TIMEOUT EXCEEDED错误发现。发生原因有select for u 阅读全文
posted @ 2022-01-01 21:34 ppjj 阅读(104) 评论(0) 推荐(0)
摘要:1,要么是长时间查询,比如因为执行了错误的执行计划就flush table或者analyze table,这样可能导致其他查询语句执行时间过长的问题, 2,要么是lock table read, 3,要么是开启了事务没有提交, 4,要么是关闭了自动提交事务配置。 阅读全文
posted @ 2022-01-01 21:32 ppjj 阅读(135) 评论(0) 推荐(0)
摘要:blocked nested loop join使用了数组arr[join_buffer_size],如果外层小表数量把数组撑满了,然后到内层大表中全表扫描查询数据,把符合条件的数据保存下来,然后清空数组,再到外层小表中把数组撑满如此往复,直到小表没数据了,查询也就结束了,内层大表查询不用索引,也可 阅读全文
posted @ 2021-12-15 16:53 ppjj 阅读(130) 评论(0) 推荐(0)
摘要:1,MySQL左连接查询并分页,可能右边表不存在满足查询条件需要的数据,应该返回空列表,但是左边表有数据就会返回数据,不符合实际情况的需求,这时需要先在左边表里先用exists子句来关联右边表中的某个字段的查询条件来判断是否存在右边表中的数据,如果不存在就返回空列表数据,这时就满足需求了,除非右边表 阅读全文
posted @ 2021-01-16 12:54 ppjj 阅读(282) 评论(0) 推荐(0)
摘要:SQL语句: SELECT * FROM table_name AS ta WHERE ta.唯一键 = ( SELECT max( tb.唯一键 ) FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 ); 如果想排序加分页查询,SQL语句: SEL 阅读全文
posted @ 2020-12-20 18:41 ppjj 阅读(4963) 评论(0) 推荐(1)
摘要:如果需要对关联查询(inner join)做分组(group by),并且按照关联表(actor)中的某个列进行分组,那么通常采用关联表(actor)的标识列(actor_id)分组的效率比其他列更高: select actor.first_name,actor.last_name,count(*) 阅读全文
posted @ 2020-07-26 18:08 ppjj 阅读(1348) 评论(0) 推荐(0)
摘要:索引起码用到range类型,不然查询效率会很差。 MySQL覆盖索引,也叫包含索引,通过查看explain中extra列是否有using index判断是否使用覆盖索引。因为覆盖索引要存储索引列的值,所以哈希索引,空间索引,全文索引都不存储索引列的值,MySQL只能使用B-Tree索引做覆盖索引。如 阅读全文
posted @ 2020-07-26 17:06 ppjj 阅读(1435) 评论(0) 推荐(0)
摘要:在组合索引中,除了使用between匹配外,采用<,>,like等进行匹配都会导致后面的列无法走索引,因为通过以上方式匹配到的数据是不可知,可以把范围查询放到最后面。 但是可以通过ICP技术(版本5.6+支持),即索引过滤,进行二级索引(explain中值是range,ref,eq_ref或者ref 阅读全文
posted @ 2020-07-26 16:58 ppjj 阅读(373) 评论(0) 推荐(0)
摘要:pt-ioprofile 是 pt-tools 中的一款性能分析工具,可以监听 MySQL 进程,输出 IO 操作的次数/总时间/平均时间。其原理如下:pt-ioprofile 用 strace 监听 MySQL 的系统调用,筛选其中与 IO 相关的系统调用,进行统计。同时 pt-ioprofile 阅读全文
posted @ 2020-07-26 16:55 ppjj 阅读(218) 评论(0) 推荐(0)
摘要:pt-ioprofile 是 pt-tools 中的一款性能分析工具,可以监听 MySQL 进程,输出 IO 操作的次数/总时间/平均时间。其原理如下:pt-ioprofile 用 strace 监听 MySQL 的系统调用,筛选其中与 IO 相关的系统调用,进行统计。同时 pt-ioprofile 阅读全文
posted @ 2020-07-26 16:54 ppjj 阅读(218) 评论(0) 推荐(0)
摘要:redo log的大小是固定的,在mysql中可以通过修改配置参数innodb_log_files_in_group和innodb_log_file_size配置日志文件数量和每个日志文件大小,redo log采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。redo log通常是物理日志, 阅读全文
posted @ 2020-06-07 13:18 ppjj 阅读(2595) 评论(0) 推荐(0)
摘要:索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。在mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应值,然后根据匹配的索引记录找到对应的行。 我们首先了解一下索引的几种类型和索引的结构。 索引类型 B树 大多数存储引擎 阅读全文
posted @ 2020-06-06 17:40 ppjj 阅读(1002) 评论(0) 推荐(0)
摘要:MySQL服务器配置,innodb_buffer_pool_size缓冲池,设置为服务器内存的75%-80%,innodb_log_buffer_size设置日子文件大小,如果太小影响写操作,如果太大影响数据恢复,innodb_log_buffer_size日子缓冲区大小,一般不需要太大,16M以内 阅读全文
posted @ 2020-05-10 12:09 ppjj 阅读(206) 评论(0) 推荐(0)
摘要:网上写MySQL架构的文章比较多,写InnoDB架构的文章比较少,今天简单说说InnoDB架构。 画外音:一分钟,一幅图,秒懂。 作者:58沈剑 MySQL简要架构是怎么样的? MySQL整体分为三层: (1)客户端,是各种编程语言的connector; (2)MySQL服务,内部包含各种组件,实现 阅读全文
posted @ 2020-05-10 12:04 ppjj 阅读(311) 评论(0) 推荐(0)
摘要:可能你从未看到过这样的一篇集中火力式的把mysql参数列了这么全的文章,很有兴曾参与过超3万并发的18~19年的数轮520、618、双11、双12保卫战。因此这一篇是汇集了最精华和实战的内容把mysql所有的参数列在这边供大家参考。并且以(64c cpu,128gb内存)的mysql cpu和内存来 阅读全文
posted @ 2020-05-10 11:45 ppjj 阅读(1646) 评论(0) 推荐(1)
摘要:innodb以前不支持高并发,在高并发下就是悲剧,全部卡在mutex(缓冲池mutex)上,现在通过线程调度器控制线程怎么进入内核访问数据,参数为innodb_thread_concurrency,它有计算公式:CPU数量*磁盘数量*2。 如果无法进入内核会休眠innodb_thread_sleep 阅读全文
posted @ 2020-05-10 10:45 ppjj 阅读(222) 评论(0) 推荐(0)