linux视频播放网站,广告协会网站建设方案,摄影学习网站,网站优化软件排名器Mysql进阶 存储引擎前言特点对比 索引介绍常见的索引结构索引分类索引语法sql分析索引使用原则索引失效的几种情况sql提示覆盖索引前缀索引索引设计原则 存储引擎
前言
Mysql的体系结构#xff1a;
连接层 最上层是一些客户端和链接服务#xff0c;主要完成一些类似于连接… Mysql进阶 存储引擎前言特点对比 索引介绍常见的索引结构索引分类索引语法sql分析索引使用原则索引失效的几种情况sql提示覆盖索引前缀索引索引设计原则 存储引擎
前言
Mysql的体系结构
连接层 最上层是一些客户端和链接服务主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层 第二层架构主要完成大多数的核心服务功能如SQL接口并完成缓存的查询SQL的分析和优化部分内置函数的执行。所有跨存储引擎的功能也在这一层实现如 过程、函数等。引擎层 存储擎真正的负责了MySQL中数据的存储和提取服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能这样我们可以根据自己的需要来选取合适的存储引擎。存储层 主要是将数据存储在文件系统之上并完成与存储引擎的交互。
tip存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的而不是基于库的所以存储引擎也可被称为表类型。
相关sql语句
# 查看建表语句 默认的存储引擎是InnoDB
show create table [表名]
# 查看存储引擎
show engines;特点
InnoDB(重点) MyISAM Memory
对比 存储引擎的选择 在选择存储引擎时应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统还可以根据实际情况选择多种存储引擎进行组合。
InnoDB: 是Mysq的默认存储引擎支持事务、外键。如果应用对事务的完整性有比较高的要求在并发条件下要求数据的一致性数据操作除了插入和查询之外还包含很多的更新、删除操作那么nnoDB存储引擎是比较合适的选择。MyISAM : 如果应用是以读操作和插入操作为主只有很少的更新和删除操作并且对事务的完整性、并发性要求不是很高那么选择这个存储弘擎是非常合适的。类似MongoDBMEMORY: 将所有数据保存在内存中访问速度快通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制太大的表无法缓存在内存中而且无法保障数据的安全性。类似Redis
索引
介绍
索引(index)是帮助MySQL高效获取数据的数据结构(有序。在数据之外数据库系统还维护着满足特定查找算法的数据结构这些数据结构以某种方式引用(指向)数据 这样就可以在这些数据结构上实现高级查找算法这种数据结构就是索引。 优缺点 索引结构
常见的索引结构
B树多路平衡查找树
叶子节点和非叶子节点都存放数据。 B树
叶子节点存放数据非叶子节点存放指针。 Hash
Hash索引只能用于对等比较(in)不支持范围查询 (between…。无法利用索引完成排序操作。查询效率高通常只需要一次检索就可以了效率通常要高于Btree索引。 面试题 为什么InnoDB存储引擎选择使用Btree索引结构? 相对于二叉树层级更少搜索效率高。对于B-tree无论是叶子节点还是非叶子节点都会保存数据这样导致一页页的大小是固定的16kb中存储的键值减少指针跟着减少要同样保存大量数据只能增加树的高度导致性能降低。相对Hash索引Btree支持范围匹配及排序操作。
索引分类 聚集索引一级索引叶子节点保存行数据
非聚集索引二级索引叶子节点保存关联的主键 聚集索引选取规则:
如果存在主键主键索引就是聚集索引。如果不存在主键将使用第一个唯一(UNIQUE)索引作为聚集索引。如果表没有主键或没有合适的唯一索引则innoDB会自动生成一个rowid作为隐藏的聚集索引。 当查询时先走二级索引查到主键id然后根据主键id走聚集索引查到行数据这种情况称为回表查询因为回表查询需要走两次索引所以相对效率较低。 InnoDB的主键索引高度有多高? 当高度为3时也能存储2千万条左右的数据。 索引语法 sql分析
sql的执行频率
# 查看增删改查的频率
show global STATUS LIKE Com_______;慢查询日志 profiling详情
开启 使用
explain执行计划 各字段的含义id select查询的序列号表示查询中执行selet子句或者是操作表的顺序(id相同执行顺序从上到下;id不同值越大越先执行)。 select type 表示 SELECT 的类型常见的取值有 SIMPLE(简单表即不使用表连接或者子查询)、PRIMARY(主查询即外层的查询)UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY (SELECT/WHERE之后包含了子查询)等。 type 表示连接类型性能由好到差的连接类型为NULL、system、const、eg ref、ref、range、index、all。 possible key 显示可能应用在这张表上的索引一个或多个。 Key 实际使用的索引如果为NULL则没有使用索引。 Key_len 表示索引中使用的字节数该值为索引字段最大可能长度并非实际使用长度在不损失精确性的前提下长度越短越好。 rows MySQL认为必须要执行查询的行数在innodb引擎的表中是一个估计值可能并不总是准确的。 filtered 表示返回结果的行数占需读取行数的百分比filtered 的值越大越好。 索引使用原则
最左前缀法则 如果索引了多列(联合索引)要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始并且不跳过索引中的列。如果跳跃某一列索引将部分失效(后面的字段索引失效)不包含最左索引字段则全部失效和索引字段的顺利没有关系存在即可。 范围查询 联合索引中出现范围查询(,)范围查询右侧的列索引失效。尽量使用,) 索引失效的几种情况
索引列运算 不要在索引列上进行运算操作索引将失效。 字符串不加引号 字符串类型字段使用时不加引号索引将失效。存在隐式转换 模糊查询 如果仅仅是尾部模糊匹配索引不会失效。如果是头部模糊匹配索引失效。 or连接的条件 用or分割开的条件如果or前面的条件中的列有索引而后面的列中没有索引那么涉及的索引都不会被用到当or前后条件都有索引时索引才生效。 数据分布影响 如果MySQL评估使用索引比全表更慢则不使用索引,如对索引字段进行null值判断name is null || name is not null当数据库中大部分的值都是有值那么 is null 索引生效not null 索引失效。 sql提示
SQL提示是优化数据库的一个重要手段简单来说就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
# 建议mysql使用这个索引最后索引的选择还是由mysql决定
use index:
# 举个例子
explain select* from tb_user use index(idx_user_pro) where profession 软件工程
# 忽略索引
ignore index:
# 强制使用这个索引
force index:覆盖索引 尽量使用覆盖索引(查询使用了索引并且需要返回的列在该索引中已经全部能够找到)减少select *,避免回表查询。 可通过explain查看Extra
前缀索引 当字段类型为字符串(varchartext等)时有时候需要索引很长的字符串这会让索引变得很大查询时浪费大量的磁盘0影响查询效率。此时可以只将字符串的一部分前缀建立索引这样可以大大节约索引空间从而提高索引效率。 索引设计原则 针对于数据量较大且查询比较频繁的表建立索引。 针对于常作为查询条件 (where)、排序(order by)、分组 (group by) 操作的字段建立索引。 尽量选择区分度高的列作为索引尽量建立唯一索引区分度越高使用索引的效率越高。 如果是字符串类型的字段字段的长度较长可以针对于字段的特点建立前缀索引。 尽量使用联合索引减少单列索引查询时联合索引很多时候可以覆盖索引节省存储空间避免回表提高查询效率 要控制索引的数量索引并不是多多益善索引越多维护索引结构的代价也就越大会影响增删改的效率。 如果索引列不能存储NULL值请在创建表时使用NOT NUL约束它。当优化器知道每列是否包含NUL值时它可以更好地确定哪个索引最有效地用于查询。
后记 美好的一天到此结束下次继续努力欲知后续请看下回分解写作不易感谢大家的支持