mysql执行计划

58到家MySQL军规升级版

好久不见. 提交于 2019-11-30 09:33:35
一、基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储4字节例如表情符号时,使用它 禁止使用存储过程,视图,触发器,Event 解读: (1)对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层 (2)调试,排错,迁移都比较困难,扩展性较差 禁止在数据库中存储大文件,例如照片,可以将大文件存储在对象存储系统,数据库中存储路径 禁止在线上环境做数据库压力测试 测试,开发,线上数据库环境必须隔离 二、命名规范 库名,表名,列名必须用小写,采用下划线分隔 解读:abc,Abc,ABC都是给自己埋坑 库名,表名,列名必须见名知义,长度不要超过32字符 解读:tmp,wushan谁TM知道这些库是干嘛的 库备份必须以bak为前缀,以日期为后缀 从库必须以-s为后缀 备库必须以-ss为后缀 三、表设计规范 单实例表个数必须控制在2000个以内 单表分表个数必须控制在1024个以内 表必须有主键,推荐使用UNSIGNED整数为主键 潜在坑:删除无主键的表,如果是row模式的主从架构,从库会挂住 禁止使用外键,如果要保证完整性,应由应用程式实现 解读:外键使得表之间相互耦合,影响update/delete等SQL性能

史上最全大厂Mysql面试题总结

心不动则不痛 提交于 2019-11-30 07:01:11
今天跟大家分享下大厂Mysql面试题的知识。 1 MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 从:sql执行线程——执行relay log中的语句; 2 MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MVCC, 而MyISAM不支持 4>.InnoDB支持外键,而MyISAM不支持 5>.InnoDB不支持全文索引,而MyISAM支持。 (2)、innodb引擎的4大特性 插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead) (3)、2者selectcount(*)哪个更快,为什么 myisam更快,因为myisam内部维护了一个计数器,可以直接调取。 3 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别

mysql之sql语句执行过程;

*爱你&永不变心* 提交于 2019-11-30 05:47:20
1.SQL语句执行过程 1.客户端发送一条sql查询语句给服务器; 2.服务器通过权限检查之后 , 首先会检查查询缓存 ,如果命中了缓存,则立即返回 存储在缓存中的结果,否则进入下一步; 3.服务器端 进行sql解析,预处理,再由查询优化器根据该sql所涉及的数据表的统计信息进行计算,生成对应的执行计划; 4.mySQL根据 查询优化器生成的执行计划,调用存储引擎的API来执行查询; 5.将查询结果返回给客户端; 2.SQL语句执行过程的注意事项 1 .在执行查询时所使用过存储引擎就是该数据库使用的存储引擎 2.sql执行的最大瓶颈在大于磁盘的IO,即数据的读取:不同SQL语句的写法,会造成不同的执行计划的执行,而不同的执行计划在IO上面临完全不一样的数据级,从而造成性能差距; 3.所以说: sql优化其实就是让查询优化器根据程序员的计划选择匹配的执行计划,来减少查询中产生的IO 来源: https://www.cnblogs.com/sxf20/p/11563909.html

MySQL索引&&开发规范

三世轮回 提交于 2019-11-30 05:38:15
规范总结 索引规范 默认添加的索引都是BTree索引。Innodb只支持BTree索引。 设计索引原则 - 最适合索引的列是WHERE子句中的列,而不是SELECT中的列。 - 如果索引的字段很长,使用前缀索引 - 删除不常用索引 - 建议单表不超过5个 单表索引不超过5个【索引可以提高查询效率,但是会减小插更新效率】 每个 Innodb 表必须有个主键,【主键建议使用自增 ID 值】 索引列建议 出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列 包含在 ORDER BY、GROUP BY、DISTINCT 中的字段 并不要将符合 1 和 2 中的字段的列都建立一个索引, 通常将 1、2 中的字段建立联合索引效果更好 多表 join 的关联列 避免建立冗余索引和重复索引 重复索引示例:primary key(id)、index(id)、unique index(id) 冗余索引示例:index(a,b,c)、index(a,b)、index(a) 覆盖索引 to be continue 外键约束取舍 开发规范 禁止使用 SELECT * 必须使用 SELECT 查询 用join操作代替子查询 使用join关联的表最好不超过5个 对应同一列进行 or 判断时,使用 in 代替 or 禁止使用 order by rand() 进行随机排序

mysql 优化

。_饼干妹妹 提交于 2019-11-30 04:17:54
id select 查询的序列号,包含一组可以重复的数字,表示查询中执行sql语句的顺序。一般有三种情况: 第一种:id全部相同,sql的执行顺序是由上至下; 第二种:id全部不同,sql的执行顺序是根据id大的优先执行; 第三种:id既存在相同,又存在不同的。先根据id大的优先执行,再根据相同id从上至下的执行。 select_type select 查询的类型,主要是用于区别普通查询,联合查询,嵌套的复杂查询 simple :简单的select 查询,查询中不包含子查询或者union primary :查询中若包含任何复杂的子查询,最外层查询则被标记为primary subquery :在select或where 列表中包含了子查询 derived :在from列表中包含的子查询被标记为derived(衍生)MySQL会递归执行这些子查询,把结果放在临时表里。 union :若第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为:derived union result :从union表获取结果的select partitions 表所使用的分区,如果要统计十年公司订单的金额,可以把数据分为十个区,每一年代表一个区。这样可以大大的提高查询效率。 type 这是一个非常重要的参数,连接类型,常见的有

mysql查询优化

﹥>﹥吖頭↗ 提交于 2019-11-30 02:22:43
优化器 开启方法: set optimizer_trace="enabled=on"; 在执行完目标语句后执行如下sql即可看到执行计划日志 select * from information_schema.OPTIMIZER_TRACE; 准备阶段: 优化阶段:条件处理 常量传递 equality_propagation a = 1 AND b > a -- 会被优化为如下形式 a = 1 AND b > 1 等值传递 constant_propagation sql a = b and b = c and c = 5 -- 会被优化为如下形式 a = 5 and b = 5 and c = 5 移除无用条件 trival_condition_removal a = 1 and 1 = 1 -- 会被优化为如下形式 a = 1 基于成本的执行方案选择 一个查询可以有不同的执行方案,可以选择某个索引进行查询,也可以选择扫描全表,查询优化器会选择其中成本最低的方案进行查询。 IO成本 innodb存储引起需要将数据和索引都存储在磁盘上,当我们想要查询表数据时,需要先把数据或者索引加载到内存中再进行操作。 CPU成本 读取以及检测记录是否满足对应的搜索条件,对结果集进行排序这些操作损耗的时间称为CPU成本。 InnoDB存储引擎规定读取一个页面花费的默认成本是1

数据库 Mysql-mongodb-redis

那年仲夏 提交于 2019-11-29 22:32:33
目录 1. Mysql 1.1. 介绍 1.1.1 基础 1.1.3 数据库操作 1.2. 查询 1.2.1 条件 1.2.2 聚合 1.2.3 分组 1.2.4 排序 1.2.4 分页 1.3. 高级 1.3.1 关系 1.3.2 连接 1.3.3 自连接 1.3.4 子查询 1.3.5 内置函数 1.3.6 视图 1.3.7 事务 1.4. 与python交互 1.4.1 交互类型 1.4.2 增改删 1.4.3 查询 2. MongoDB 2.1. 基本操作 2.1.1 安装 2.1.2 数据库操作 2.1.3 集合操作 2.1.4 数据类型 2.1.5 数据操作 2.1.6 数据查询 2.2 高级操作 2.3 与python交互 3. redis 3.1 安装 3.2 基本配置 3.3 数据操作 3.3.1 string 3.3.2 键的命令 3.3.3hash 3.3.4 list 3.3.5 set 2.3.6 zset 3.4 与python交互 数据库系统解决的问题:持久化存储,优化读写,保证数据的有效性 当前使用的数据库,主要分为两类 文档型,如sqlite,就是一个文件,通过对文件的复制完成数据库的复制 服务型,如mysql、postgre,数据存储在一个物理文件中,但是需要使用终端以tcp/ip协议连接,进行数据库的读写操作 1. Mysql 1.1. 介绍

MySQL常见优化

偶尔善良 提交于 2019-11-29 21:35:38
MySQL常见优化 1.操作符优化 1.1<> 操作符(不等于) 1.2LIKE优化 1.3in,not in,exists与not exists 1.3.1in和exists 2.where子句优化 2.1第一个原则:在where子句中应把最具限制性的条件放在最前面。 2.2第二个原则:where子句中字段的顺序应和索引中字段顺序一致。 2.3应尽量避免在 where 子句中使用 or 来连接条件, 2.4应尽量避免在 where 子句中等号的左端对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: 2.5在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引, 3.SQL语句注意事项 3.1在查询中不要使用select * 3.2尽量写WHERE子句 3.3注意SELECT INTO后的WHERE子句 3.4对于聚合查询,可以用HAVING子句进一步限定返回的行 3.5避免使用临时表 3.6减少访问数据库的次数: 3.7尽量少做重复的工作 1.操作符优化 1.1<> 操作符(不等于) 优化原因: 不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: a): 用其它相同功能的操作运算代替,如 a<>0 改为 a>0 or a<0 a<>'' 改为 a>'' b): 尽量便面使用 !

MySQL索引原理及SQL优化

こ雲淡風輕ζ 提交于 2019-11-29 20:51:32
目录 索引(Index) 索引的原理 b+树 MySQL如何使用索引 如何优化 索引虽好,不可滥用 如何验证索引使用情况? SQL优化 explain查询执行计划 id select_type table type possible_keys key key_len ref rows Extra 优化数据库结构 优化数据大小 优化数据类型 索引(Index) MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。 创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。 索引的原理 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据

Mysql-索引

非 Y 不嫁゛ 提交于 2019-11-29 19:52:57
索引 简介 无索引的表是一组无序的行,当我们在查询表中的某条数据时,它会逐行查询去找到匹配的行, 这是一个全表扫描操作,效率很低。 用来加速查询的技术有很多,其中最为重要的就是索引,通常情况下,查询速度差异的最大因素 就是索引的使用是否得当。此外需要注意,有些查询的编写方法会阻碍你对索引的有效利用。 索引提高效率的做法 1)可以知道匹配行在什么位置结束,可以跳过其余的部分 2)利用定位算法,不用从索引开始位置进行线性扫描即可找到匹配项,比如二分法 为什么不直接对数据排序,省掉索引操作? 分析:   直接对数据排序,省掉索引的操作也能加快数据检索的速度             V   如果表中只有一个索引,那么这是肯定的             V   但是如果你还想添加第二个索引,同时按两种方式对数据进行排序   比如,一个有关客户名字的索引,一个有关客户电话号码的索引             V   将索引从数据行中分离出来便可解决这个问题,而且还可以创建多个索引             V   索引里的数据通常比表中的数据行更短,当对索引增删值时,为保持排序顺序,   来回移动索引的较短的索引值比移动较长的数据行更加容易 案例:有索引和无索引的查询分析 假设,你有3个无索引表,t1,t2和t3,其中每个表都包含一个列,分别为i1,i2和i3,并且每个列有1000行,包含的是1