MySQL7新特性之JSON数据类型

MySQL 5.7.8开始,原生提供了一个JSON类型的数据格式,在此之前类似的需求都是需要通过VARCHAR的方式来存储处理的。

  • JSON数据类型,拥有自动校验格式功能;
  • 提供操作JSON数据的内置函数;
  • 优化的存储格式,存储在JSON列中的JSON数据被转换成内部的存储格式,允许快速读取;
  • 支持修改JSON对象的特定属性,而不需要更新整个JSON内容;
  • 支持创建JSON对象的特定属性索引;

创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE user
(
id INT AUTO_INCREMENT,
username VARCHAR(12) NOT NULL COMMENT '用户名',
password VARCHAR(32) NOT NULL COMMENT '密码',
extends JSON NULL COMMENT '扩展信息',
CONSTRAINT user_pk
PRIMARY KEY (id)
)
COMMENT '用户表';

CREATE UNIQUE INDEX user_username_uindex
ON user (username);

直接指定字段的类型为JSON即可。

Canal数据同步中间件初探

MySQL本身是支持主从模式(Master/Slave)的,Master产生的日志(binary log)中记录了所有增删改语句,将日志发送到Slave执行即可完成数据库的增量数据同步操作。

Canal是阿里巴巴开源的一个中间件,他的作用就是解析binary log来完成数据同步的。
源码地址:https://github.com/alibaba/canal

Canal工作原理

image.png

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary logslave(也就是canal)
  3. canal解析binary log对象(原始为byte流)

MySQL Emoji 表情字符支持

utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常:

1
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1

针对该问题处理最简单的方式是更改数据库的编码为utf8mb4,直接将问题扼杀在摇篮中。

前置条件

  • MySQL服务器版本不能低于5.5.3;
  • MySQL驱动版本不能低于5.1.13;

一些常见的 SQL 语句优化方法

  1. 应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。
  2. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  3. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
1
2
3
select id from t where num is null
# 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
  1. 尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
1
2
3
4
5
select id from t where num=10 or num=20
#可以这样查询:
select id from t where num=10
union all
select id from t where num=20
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×