MySql生僻知识点

  1. Enum数据类型,enum('a','b','abc')

Enum类型允许输入指定集合中的一个值,输入内容不区分大小写,最多允许65535个成员

  1. Set类型, set('a','b','c')

Set类型允许输入指定集合中的一个或多个值,多个值之间用逗号分隔,最多允许64个成员。
set类型会自动去掉重复的数据,比如插入 ‘a,b,a,b,a’,库中只会存储 'a,b'

  1. 安全的等于运算符 <=>

使用安全等于时 NULL<=>NULL 的值为1,效果等同于is null,而NULL=NULL的值为null

  1. 正则表达式运算符 regexp
  -- 查询名字为aeiou中任意一个字母开头,ok结尾的数据
  SELECT * FROM t WHERE name REGEXP '^[aeiou]|ok$'; 
  -- 查询名字中包含mar的数据
  SELECT name FROM t WHERE name REGEXP 'mar';
  -- 查询名字以ok结尾的数据
  SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
  -- 查询名字以'st'为开头的数据
  SELECT name FROM person_tbl WHERE name REGEXP '^st';
  1. if函数, if(value, v1, v2) 如果value为真,则返回v1,否则返回v2
    ifnull函数, ifnull(v1,v2) 如果v1不为null就返回v1,否则返回v2
-- 如果年龄大于20就返回man,否则返回boy
select if(age>20,'man','boy') from t 
-- 如果年龄字段为null,就返回0
select ifnull(age, 0) from t
  1. 其他常用函数
函数 功能 使用举例
DATABASE() 返回当前数据库名 select database();
VERSION() 返回当前数据库版本 select version();
USER() 返回当前登录用户名 select user();
INET_ATON(ip) 返回ip地址的数字表示 select inet_aton('192.168.1.1'); 可以用来比较两个IP地址,比如想要知道两个IP段之间有多少个地址
INET_NTOA(num) 返回数字num代表的IP地址 select inet_ntoa(3232235777);
PASSWORD(str) 返回字符串str的加密版本 select password('aaa');
MD5(str) 返回字符串str的md5值 select md5('aaa')
  1. 各种数据库存储引擎的特性
特点 MyISAM InnoDB MEMORY MERGE NDB
存储限制 64TB 没有
事物安全 支持
锁机制 表锁 行锁 表锁 表锁 行锁
B树索引 支持 支持 支持 支持 支持
哈希索引 支持 支持
全文索引 支持
集群索引 支持
数据缓存 支持 支持 支持
索引缓存 支持 支持 支持 支持 支持
数据可压缩 支持
空间使用 N/A
内存使用 中等
批量插入速度
支持外键 支持
  1. 浮点数和定点数
名称 数据类型 特点 使用场景
浮点数 float/double 存在误差,不能直接比较两个浮点数,可对数据自动进行四舍五入 对数据精度有一定的容忍度的数据
定点数 decimal 没有误差,对于超出精度的数据可以根据SQLMode进行警告或禁止插入 对货币等精度敏感的数据,应使用定点数
  1. MySql的字符集

对于客户端和服务端交互,MySql提供了三个参数 character_set_client(客户端)、character_set_connection(连接)、character_set_results(返回结果)标示字符集,只有当这三个字符集完全相同的时候,才能确保用户写入的数据正确度出,一般在 my.cnf 中用[mysql] default-character-set=UTF-8来设置默认字符集

  1. 查看执行计划
-- 使用explain命令查看执行计划,分析索引使用情况,找出优化方案
explain select * from t where c1='a' and c2 like '%b%' \G;
  1. 视图的可更新性

在视图中可以进行update和delete操作,操作的结果会反应在视图的源表中.例如:update了视图的一个字段,对应的源表中的字段也会自动修改,delete操作同理。但是,包含以下条件的视图是不能进行更新操作的:
1)视图的SQL中包含聚合函数(sum,count等)、DISTINCT、GROUP BY、HAVING、UNION或UNION ALL
2)常量视图
3)select中包含子查询
4)join
5)from一个不能更新的视图
6)where子句的子查询引用了from子句中的表

  1. 锁表和解锁
--加读锁,当前session和其他session还可以继续读取表数据,但是都不能更新表数据
lock tables tableName read;
--加写锁,其他session不能读写表数据,只有当前session可读写表数据
lock tables tableName write;
--解锁,会释放当前线程获得的任何锁定,当与服务器的链接断开时,当前线程的锁定也会被隐含解锁
unlock tables
  1. 事务
-- 开始一个事务,开启事务时,unlock tables会被隐含执行
start transaction  或 begin
-- 提交事务 / 提交事务后立即启动一个新的同一隔离级别的事务 / 提交事务后断开客户端连接
commit / commit and chain / commit and release
-- 回滚整个事务
rollback
-- 在事务执行过程过(start transation 后 commit或rollback前)定义一个名字为pointName的point
savepoint pointName
-- 回滚到名字为pointName的point,在point之后的sql会被回滚
rollback to savepoint pointName
-- 设置事务自动提交/不自动提交
set autocommit=1或0
  1. 分布式事务(直到MySQL-5.7.7才完美支持分布式事务)

目前Mysql分布式事务的缺点:1)性能太低,与一个数据库的事务相比差了10倍 2)对版本有要求,只有5.7.7以上的版本才有完美的分布式事务解决方案

  1. 对于特别大的表,可以使用分区功能(分区对应用来说完全透明,不影响应用业务逻辑)

分区的优点:1)可以存储更多数据 2)优化查询,where子句包含分区字段时,可以只扫描一个或多个分区 3)可以快速删除过期的数据 4)跨多个磁盘来分散查询,能获得更大的吞吐量

分区类型 说明 接收数据类型 多字段
RANGE分区 基于一个给定的连续区间范围,把数据分配到不同的分区 除blob和txt以外的类型 支持
LIST分区 类似RANGE分区,区别在于LIST分区是基于枚举值进行分区,RANGE分区是基于连续的值 INT 不支持
HASH分区 基于给定的分区个数,把数据分配到不同的分区 ,支持自定义表达式 INT 不支持
KEY分区 类似HASH分区,不支持自定义表达式 除blob和txt以为的类型 支持

HASH和KEY分区一般搭配linear关键字强制使用线性分区方式,可以防止重新调整分区的时候导致大量计算的问题。

--查看当前数据库是否支持分区
show plugins
--如果结果里有名称为partition,状态为ACTIVE的数据,表名当前数据库支持分区
-- 1.Hash分区方式(如果有主键,只能使用主键作为分区字段),Hash分区只支持int。
create table emp (id int, salary decimal(7,2), birth_date DATE) 
engine=innodb 
partition by hash(MONTH(birth_date)) 
partitions 6

--2. Key分区方式,支持使用字符串进行分区。
create table emp (id int, a varchar(10)) 
engine=innodb 
partition by key(a) 
partitions 4

--2.5 Hash和Key分区默认使用取膜的方式进行分区,导致的问题是新增或删除分区的时候,之前的分区都要进行重新计算,所以MySQL提供了一种线性Hash和线性key分区,使用2的幂的运算法则来解决这个问题。
create table emp (id int, a varchar(10)) 
engine=innodb 
partition by linear key(a) 
partitions 4

--3.Range分区方式,按数字大小分段
create table emp1 (id int, salary decimal(7,2), birth_date DATE, primary key(id)) 
engine=innodb 
partition by range(id)(
    partition p0 values less than (10)
        INDEX DIRECTORY = '/data/emp'
        DATA DIRECTORY = '/data/emp',
    partition p1 values less than (20)
        INDEX DIRECTORY = '/data1/emp'
        DATA DIRECTORY = '/data1/emp',
    partition p2 values less than (30)
        INDEX DIRECTORY = '/data2/emp'
        DATA DIRECTORY = '/data2/emp',
    partition p3 values less than maxvalue
        INDEX DIRECTORY = '/data3/emp'
        DATA DIRECTORY = '/data3/emp'
)

--4. list分区,分区字段只能在有限集合内
create table emp3 (id int, salary decimal(7,2), birth_date DATE, category int) 
engine=innodb 
partition by list(id)(
    partition p0 values in (1,3),
    partition p1 values in (2,4),
    partition p2 values in (5,7,9),
    partition p3 values in (10,11)
)

--5. 新增/删除/拆分/合并Range和List分区
alter table emp3 drop partition p2;
alter table emp3 add partition (partition p4 values less than (2030));
alter table emp3 reorganize partition p3 into (
  partition p2 values less than (1000),
  partition p4 values less than (2000)
);
alter table emp3 reorganize partition p2,p3,p4 into( partition p5  values less than (5000)); 

--6. 新增/删除Hash和Key分区
alter table emp add partition 2;  (减少到2个分区)
alter table emp coalesce partition 8;  (新增8个分区)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,320评论 0 9
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,817评论 5 116
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,035评论 0 19
  • 一、MySQL架构与历史 A.并发控制 1.共享锁(shared lock,读锁):共享的,相互不阻塞的。 2.排...
    阿休阅读 4,649评论 0 37
  • 调用python内置函数 函数名(参数) 即可调用python内置函数 help(函数名) 返回python对于函...
    HTML_HTML阅读 294评论 0 0