2018-12-30

MYSQL - ( 一 )

事务隔离级别

  • read-uncommitted 三种问题都有
  • read-committed 不可重复读、幻读、
  • repeatable-read 幻读(加上 MVCC 可防止这个问题)
  • serializable 无

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,
导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,
但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,
就好像发生了幻觉一样,这就叫幻读。

注意 不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

分布式集群 和 主从,怎么样保证节点数据一致 ?

同步复制:全部写成功了,才返回用户成功(分布式集群)

异步复制:产生binlog,但不能保证从库一定能接收到(mysql主从),主库挂了,从库数据丢失

半同步复制: 至少有一个从库可以执行成功

mysql内部复制方式结构

[mysql主从结构] --> 5.5-单线程 5.6-多线程

Bin-log/relay log
行模式
buffer pool
Mysql升序排序速度大于降序排序速度,因为page之间是双链表,page内部是单向链表
一个page 最大16k,至少要保证有两块数据(因为双向列表),所以一条数据最大只能是8k。单条数据过大的时候,会申请额外内存,page中存储部分数据+额外内存地址

覆盖索引
等值索引在前,范围索引在后,比较好
根据索引估计出的行数大于总行数的30%的时候,会走全表,因为全表是顺序读取,根据索引读取有随机读取,索引在行数大于30%的时候全表更快
Force index(idx_value)可以强制指定使用某个索引,常在执行计划中使用,生产慎用,因为在数据量改变的时候,固定使用某个索引可能不是最优的,但强制之后,mysql无法自行优化
Ps: use index(索引1,索引2,索引3),可以让mysql在以上三个索引中选取索引进行查询

In 条件可以命中索引。

使用in查询的时候,mysql内部有一个参数5.5的时候是10,5.6之后是一个接近100的值,
当in里面的数据小于该值的时候,mysql会逐条根据索引分析,然后相加,
确定索引覆盖数据是否小于总数据的30%,若小于,则走索引;若in里面数据大于该值的时候,
会根据索引分布估计一个覆盖值出来,并决定是否使用索引。
explain extended 可以获取优化后的sql语句
PXC
MGR

b+树结构

  • 节点(page) 之间双向链表,节点(page) 里面是单项链表
  • 升序比降序效率高,同一个节点内可能要做反转的;
  • 2个 < page.size < 16K

索引建立规则

  1. 字段区分度高的-->比如:state见索引就不好,b+tree退化成有序链表
  2. 联合索引:区分度高的放前面
-- 等值查询
select a from b where staff_id=1 and customer_id=589;
  • INDEX idx_staff(staff_id)+INDEX idx_customer(customer_id)
    这种情况在 5.5 只能用一个索引,在 5.6 加了index merge, 会使用两个索引交集
  • INDEX idx_staff_customer(staff_id, customer_id)
  • INDEX idx_customer_staff(customer_id, staff_id)(最好的方式)
    区分度高的字段放前面,sql语句and的条件顺序没影响.
-- 范围查询
SELECT f1 FROM t1 WHERE customer_id = 2 AND payment > 10
  • INDEX idx_payment_customer(payment, customer_id)
    第一种会查出>10 然后过滤=2
  • INDEX idx_customer_payment(customer_id, payment))(最好的方式)
  1. 避免冗余索引
  2. 前缀索引
  3. 避免索引过多:写入要更新b+tree

sql优化

  1. 全表扫描 or 索引扫描
    如果扫描行数超过30%那就全表扫描,直接走主键,认为随机访问代价较高

  2. 链表查询
    关联字段创建索引,如果关联表没有建立索引,那么就会全表扫描的

  3. 批量写入的写法

INSERT INTO t(id, name) VALUES(1, 'Bea');
INSERT INTO t(id, name) VALUES(2, 'Belle');
INSERT INTO t(id, name) VALUES(3, 'Bernice');
网络开销大

INSERT INTO t(id, name) VALUES(1, 'Bea'), (2, 'Belle'), (3, 'Bernice');
网络开销小,数量大,执行时间长,死锁概率高,回滚时间长(大小控制在几十左右,经验判断)
  1. 避免大事务
    避免事务内的外部依赖,比如mq相应超时,如果当前记录与其他查询操作有阻塞,那么服务将长时间不可用

  2. 死锁,排序基本上能解决

  3. 分页查询
    SELECT id FROM t LIMIT 10000, 10; 需要查询10010条记录,拿最后的10条

    SELECT id FROM t WHERE id > 10000 LIMIT 10 通过额外条件过滤,就不需要扫描全部记录.

truncate drop delete

MySQL5.6版本以下:使用truncate table + drop table 替代 drop table
MySQL5.6版本+ : 直接使用drop table

为什么要设置不为null,并且要给定默认值.

Null 列需要更多的存储空间:需要一个额外字节作为判断是否为 NULL 的标志位,
如果一个!=null的值插入进来,那么page的大小会改变,会发生重平衡.
使用null是想让数据库做校验,但是数据库是处理存储的,这种校验的逻辑放到上层做才对.

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

推荐阅读更多精彩内容

  • Mysql概述 数据库是一个易于访问和修改的信息集合。它允许使用事务来确保数据的安全性和一致性,并能快速处理百万条...
    彦帧阅读 13,665评论 10 461
  • 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、...
    怦然心_动阅读 428评论 1 4
  • MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子...
    沉默剑士阅读 7,398评论 0 16
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,710评论 0 44
  • 时间请原谅我是一个重情重义的人,世许我们挽回不了过去,但我们能再创未来
    关一心阅读 170评论 0 0