分析MySQL中隐式转换导致查询结果错误及索引不可用

以下是例子

1
SELECT * FROM TABLE WHERE xxx = 11 

如果列xxx确实只有11的,你是否就认为筛选出来的就一定只有xxx=11的呢?

在过滤字段为数值类型的时候,数值类型有一种隐式转换,如果是以数字开头的,包含有字符,后面的字符会被截断,只取前面的数字值。

阅读更多

记一次MySQL死锁排查过程

背景

大概说一下业务场景,需要定时计算一些数据,从其他系统、接口拉取达到的数据比较多,然后经计算后的值存储在本系统中。拉取的数据量可能有万左右,然后以主键存在的数据是需要更新的。不存在则插入。每次做全量更新/插入。

阅读更多

MySQL基础

基础知识

  • mysql默认的引擎是InnoDB(MySQL5.5.5版本起)

三大范式

  • 属性具有原子性,不可再分解;
  • 不存在部分依赖;
  • 不存在传递依赖;

MySQL InnoDB 概览

InnoDB的数据存储在表空间,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成。InnoDB采用MVCC来支持高并发

MySQL执行

mysql.png

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

阅读更多

count(*) 的实现方式

  • InnoDB引擎在执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数
  • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;
阅读更多