底层架构
存储引擎
1、InnoDB存储引擎
InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
2、MyISAM存储引擎
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
3、Archive引擎
Archive档案存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
Archive表适合日志和数据采集类应用。
根据英文的测试结论来看,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。
4、Blackhole引擎
Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。
5、CSV引擎
CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引。
CSV引擎可以作为一种数据交换的机制,非常有用。
CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。
行内以逗号隔开,行外以换行符隔开
6、Memory引擎
如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系(放在内存中的),那么使用Memory表是非常有用。Memory表至少比MyISAM表要快一个数量级。
类似redis等NoSQL,所以,被NoSQL替代了
7、Federated引擎
联合引擎
Federated引擎是访问其他MySQL服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题(效率太低),因此默认是禁用的。
InnoDB和MyISAM对比
时间类型
Mysql时间类型转字符串
to_char(time,'YYYY-MM-DD hh24:mi:ss') 24h制 to_char(time,'YYYY-MM-DD') to_char(time,'YYYY-MM-DD hh:mi:ss')
表示分钟: mi
表示小时:hh 12进制,hh24 24小时制
与java不同,mm表示月
附:java中日期用字符表示
Mysql数据类型与Java类型对应
JOIN图释
注:左外连接,在 on 后面只能对右表添加单独的字段限制,对左表添加无效,如 A left join B on A.xx= B.xx and B.? = 1
索引
索引(Index)是帮助MySQL高效获取数据的数据结构
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上
存储位置:
优势与劣势
优势:
包含特定算法,提高了检索效率,降低数据库的IO成本
通过索引列对数据排序,降低了排序成本,降低了cpu消耗
劣势:
同时,因为使用了索引,插入,更新,删除不仅要更改表的数据,还要更新索引,这就使增删改变慢了
索引也是一张表,保存了主键与索引字段,指向实体表的数据记录,也要占用存储空间,而且索引一般比较大
哪些情况需要建立索引
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中与其它表关联的字段,外键关系建立索引.
单键/组合索引的选择问题,组合索引性价比更高
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
查询中统计或者分组字段
哪些情况不需要索引
表记录太少
经常增删改的表或者字段
Where条件里用不到的字段不创建索引
过滤性不好的不适合建索引
索引分类
参考:
逻辑分类
• 主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL; • 唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证号码、卡号等都可以作为唯一索引; • 普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入; • 组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合 • 全文索引:让搜索关键词更高效的一种索引
物理分类
• 聚簇索引:一般是表中的主键索引,如果表中没有显示指定主键,则会选择表中的第一个不允许为 NULL 的唯一索引,
如果还是没有的话,就采用 Innodb 存储引擎为每行数据内置的 6 字节 ROWID 作为聚集索引。
每张表只有一个聚集索引,因为聚集索引的键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引在精确查找和范围查找方面有良好的性能表现(相比于普通索引和全表扫描),
聚集索引就显得弥足珍贵,聚集索引选择还是要慎重的(一般不会让没有语义的自增 id 充当聚集索引); • 非聚簇索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同(非主键的那一列),一个表中可以拥有多个非聚集索引
Mysql索引结构
B+tree 是MySQL中被存储引擎采用最多的索引类型 B-Tree与B+Tree比较 参考:https://juejin.cn/post/7196943016392638524 先说结论:
B+Tree是B-Tree的变种,B-Tree能解决的问题,B+Tree也能够解决(降低树的高度,增大节点存储数据量)
B+Tree扫库和扫表能力更强。如果我们要根据索引去进行数据表的扫描,对B-Tree进行扫描,需要把整棵树遍历一遍,而B+TREE只需要遍历他的所有叶子节点即可(叶子节点之间有引用)。
B+Tree磁盘读写能力更强。他的根节点和支节点不保存数据区,所以根节点和支节点同样大小的情况下,保存的关键字要比B-Tree要多。所以,B+Tree读写一次磁盘加载的关键字比B-Tree更多。
B+Tree排序能力更强。上面的图中可以看出,B+Tree天然具有排序功能。
B+Tree查询性能稳定。B+Tree数据只保存在叶子节点,每次查询数据,查询IO次数一定是稳定的。当然这个每个人的理解都不同,因为在B-Tree如果根节点命中直接返回,确实效率更高。
作者:ailvyuanj
链接:https://juejin.cn/post/7196943016392638524
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
B-Tree
B+Tree
Msyql常见索引失效场景
违背了最左匹配法则
对索引列做算数、函数操作
索引中范围条件右边的列不走索引
使用不等于! 或者<>
is Not null 不走索引,但是is Null走索引
like模糊匹配以通配符开头%abc
字符串不加单引号
SQL调优
通过EXPLAIN可以模拟优化器对sql进行性能分析,主要看id,type,rows这些,看是否使用了索引,用到了哪些索引?是不是进行了全表扫描
sql优化策略:
- 避免不走索引的场景
- SELECT语句其他优化
- 增删改 DML 语句优化
- 查询条件优化
- 建表优化
语法上面的优化
- 对查询进行优化的时候,应尽量避免全表扫描 只查需要的列
- 应尽量避免在 where 子句中对字段进行 null 值判断,进行计算
- 应尽量避免在 where 子句中使用 or 来连接条件
- 对查询频繁的列建立索引
- 对排序的列建立索引
- in集合中匹配数量不超过100
与Oracle相比
Mysql属于轻量级数据库,小巧,免费(开源的),使用方便。
Oracle:大型数据库软件,收费,支撑体系完善,强大,安全性高(适用于服务器比较强大的单节点或者集群环境)
基本语法
Mysql的sql语句分类
主要
DDL 数据定义语言 在数据库中进行创建或者删除表 ,操作表的结构 DQL 数据查询语言 就是在数据库中进行查询数据表的语言 DML 数据操作语言 就是对数据表中的 数据进行添加,修改,删除,操作表中的数据 DCL 数据控制语言 用来创建数据库用户、控制数据库的 访问权限
标签:存储,Tree,查询,索引,引擎,Mysql,数据 From: https://www.cnblogs.com/deity-night/p/17153470.html