首页 > 数据库 >Mysql

Mysql

时间:2023-02-24 23:15:00浏览次数:52  
标签:存储 Tree 查询 索引 引擎 Mysql 数据

底层架构

 

 

 

存储引擎

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优化策略:

  1. 避免不走索引的场景
  2. SELECT语句其他优化
  3. 增删改 DML 语句优化
  4. 查询条件优化
  5. 建表优化

语法上面的优化

  1. 对查询进行优化的时候,应尽量避免全表扫描 只查需要的列
  2. 应尽量避免在 where 子句中对字段进行 null 值判断,进行计算
  3. 应尽量避免在 where 子句中使用 or 来连接条件
  4. 对查询频繁的列建立索引
  5. 对排序的列建立索引
  6. in集合中匹配数量不超过100

 

与Oracle相比

Mysql属于轻量级数据库,小巧,免费(开源的),使用方便。

Oracle:大型数据库软件,收费,支撑体系完善,强大,安全性高(适用于服务器比较强大的单节点或者集群环境)

 

 

基本语法

Mysql的sql语句分类

主要

 DDL 数据定义语言
    在数据库中进行创建或者删除表 ,操作表的结构
 DQL 数据查询语言
    就是在数据库中进行查询数据表的语言 
 DML 数据操作语言
    就是对数据表中的 数据进行添加,修改,删除,操作表中的数据
 DCL  数据控制语言
    用来创建数据库用户、控制数据库的 访问权限



 

标签:存储,Tree,查询,索引,引擎,Mysql,数据
From: https://www.cnblogs.com/deity-night/p/17153470.html

相关文章

  • Mysql数据库的表结构
    【INFORMATION_SCHEMA数据库】 是MySQL自带的,它提供了访问数据库 元数据 的方式,元数据:数据库名或表名,列的数据类型,或访问权限等。在MySQL中,把【INFORMATION_SCHEMA】......
  • docker部署mysql
    搜索mysql镜像dockersearchmysql拉取mysql镜像dockerpullmysql:5.7创建容器,设置端口映射、目录映射mkdir~/mysqlcd~/mysqldockerrun-id\-p330......
  • MYSQL的存储引擎以及系统数据库
    今天分享的是mysql的存储引擎,以及mysql数据库中相关配置状态和相关的变量存储引擎MyISAM存储引擎MyISAM引擎特点不支持事务表级锁定读写相互阻塞,写入不能读,读时不能写只缓......
  • Mysql、(一)Linux下Mysql 基础操作
    @目录一、Linux下安装Mysql二、启动Mysql服务三、登录Mysql四、用户权限五、Mysql的配置文件一、Linux下安装Mysql百度二、启动Mysql服务servicemysqlstartservic......
  • Mysql、(八) 主从复制
    @目录一、MySQL主从复制步骤二、主从复制的配置主机的配置从机的配置其它操作一、MySQL主从复制步骤Master将改变记录到二进制日志(binarylog)。这些记录过程叫做二......
  • Mysql、(六) Show Profile
    @目录一、ShowProfile简介二、分析步骤1.开启功能2.ShowProfile查看执行情况3.诊断具体的SQL语句三、日常开发需要注意的结论一、ShowProfile简介ShowProfile是......
  • Mysql、(七) 锁机制
    @目录一、锁的概念锁的分类二、读锁案例(MyISAM引擎)三、写锁案例(MyISAM引擎)四、MyISAM引擎锁总结五、如何分析表锁定六、行锁理论1.行锁演示2.行锁失效变为表锁3.间......
  • Mysql、(三) 体系结构与存储引擎
    @目录一、Mysql体系结构概览二、存储引擎概述三、各种存储引擎特性1.Innodb存储引擎的存储方式2.MyISAM存储引擎的特性3.存储引擎的选择一、Mysql体系结构概览整个M......
  • Mysql、(四) 索引优化
    @目录一、查看SQL执行频率二、定位低效率执行SQL1.showprocesslist:2.慢查询日志三、SQL中JOIN四、explain性能分析五、索引优化1)单表索引优化2)两表索引优化3)......
  • Mysql、(五) 千万级数据批量插入
    @目录一、开启函数创建错误日志二、创建sql脚本1)创建函数2)创建存储过程3)调用存储过程一、开启函数创建错误日志查看是否开启:showvariableslike'%log_bin......