MySQL系列之规范

1.sql语句的编写

1.执行大的delete,update,insert操作要慎重,特别是对于业务繁忙的系统,要尽量避免对线上业务产生影响。
解决办法是:大操作切割成小操作,或者使用limit子句来限制每次操作的记录数,也可以利用一些日期字段基于更小粒度的时间范围进行操作。
2.使用预编译语句,可以提高性能并且防范sql注入攻击。
3.insert into 必须显示指明使用合适的字段名称,不要使用insert into table()
4.避免在sql语句中进行数学运算和函数运算,避免将业务逻辑和数据存储耦合在一起。
5.insert语句如果使用批量提交,如insert  into table values(),()..那么values的个数不应过多,一次性提交过多记录,会导致I/O紧张,出现慢查询。
6.避免使用存储过程,触发器,函数等,这些特性会将业务逻辑和数据库耦合在一起,并且MySql的存储过程,触发器,函数中可能存在bug.
7.尽量避免使用子查询,链接,尽量将子查询转化为连接查询,mysql查询优化器会优化连接查询,但连接的表要尽可能的少,如果很多,可以考虑反范式设计。
8.使用合理的sql语句以减少与数据库的交互次数。
9.建议使用合理的分页技术以提高操作效率

2.explain工具的使用

1.使用explain工具可以确认执行计划是否良好,查询是否走了合理的索引。
2.不同版本的mysql优化器各不相同,查询的执行计划随着数据的变化也可能发生变化,这类情况就需要使用explain来验证自己的判断

explain工具实操

1.id

包含一组数字,表示查询中执行select 子句或操作表的顺序

2.select_type

表示查询中每个select子句的类型
1.simple:查询中不包含子查询或者union
2.primary:查询中若包含任何复杂子查询,最外层查询被标记为primary
3.subquery:在select 或 where 列表中包含了子查询,则该查询被标记为subquery
4.derived:在from列表中包含的子查询被标记为derived(衍生)
5.union:若第二个select出现在union之后,则被标记为derived。
6.union result:从union表中获取结果的select将被标记为 union result

3.type

type表示MySQL在表中找到所需行的方式,又称为“访问类型”,常见的类型如下所示:

1.all:Full Table Scan,MySQL将遍历全表以找到匹配的行
2.index:Full Table Scan,index 与 all 区别为index类型之遍历索引树。假设表中有主键字段id,则select id from table_name;type即为full index Scan
3.range:索引扫描范围,对索引的扫描开始于某一点,返回匹配的域或行,常见于between,<,>等的查询
4.ref:非唯一性索引扫描,将返回匹配某个单独值得到所有行。常见于使用非唯一索引或唯一索引的非唯一前缀的查找。
5.eq_ref:唯一性索引扫描,对于每个索引键表中只有一条记录与之匹配,常见于主键或唯一索引扫描
6.const,system:当MySQL对查询的某部分进行优化时,并转化为一个常量时,可使用这些类型进行访问,如果主键置与where列表中,MySQL就能将该查询准换为一个常量,system是const的一个特例,当查询的表只有一行的情况下,即可使用system.

4.possible_keys

possible_keys将指出MySQL能使用那个索引在表中找到行,查询的字段上若存在索引,则该索引将被列出,但不一定会被查询使用。

key:最有价值信息之二

key将显示MySQL在查询中实际使用到的索引,若没有使用索引,则显示为null.查询中若使用到了覆盖索引,则该索引仅仅出出现在key列表中,

key_len

key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引长度

ref

ref表示上述表的连接匹配条件,即哪些列或常亮被用于查找索引列上的值

rows:最有价值信息之三

rows 表示MySQL根据表统计信息及索引选用的情况, 估算查找所需记录需要读取的行数。使用到索引一般情况下会使得rows的值降低

Extra:最有价值信息之四

Extra 包含不适合在其他列中显示但十分重要的额外信息。可能包如下4种信息
1.Using index:该值表示相应的select操作中使用到了覆盖索引,包含满足查询需要的数据的索引称为覆盖索引
2.Using where:如果查询未能使用索引,则Using where 的作用只是提醒我们 MySQL 将用where 子句来过滤结果集
3.Using temporary:表示MySQL需要使用临时表来存储结果集,常见于order by 与 group by,事实上group by会进行隐式的order by
如果我们在group by 时利用索引分组(其实包含排序的过程)排序,则可以提高性能,因为不会此时查询输出里没有了Using temporary,Using filesort.
4.Using fileSort:Using filesort 即文件排序,MySQL 中将无法使用索引完成的排序操作,称为文件排序.

3.使用上诉的评判标准来看下列语句的执行效率

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;

3.1主键查询

1.png
explain select name from test where id = 32

type = const 效率很高
key = primary 实际使用的索引为主键
rows = 1 查找的记录数为1
extra = null ,没有任何额外信息

3.2主键范围查询

2.png
type =range 范围查询,效率不是最低
key = primary 实际使用的索引为主键
rows = 7 查找的记录数为7
extra = Using where ,最终使用where 做结果集过滤,未使用到覆盖索引
总体来说,性能是很高

3.3未带索引查询

3.png
type =ALL Full Table Scan 全表查询
key =NULL 未使用索引
rows = 7     10数据库中所有记录
extra = Using where ,最终使用where 做结果集过滤,未使用到覆盖索引。
总体来说,性能极差

3.4未带索引的分组查询

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

推荐阅读更多精彩内容