MySQL是关系型数据库 ,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
首先要知道mysql存储在磁盘里,redis存储在内存里,redis既可以用来做持久存储,也可以做缓存,而目前大多数公司的存储都是mysql + redis,mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能。
Redis 和MySQL区别
存储引擎是MySQL的组件,用于处理不同表类型的SQL操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。
使用哪一种引擎可以灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能 。MySQL服务器使用可插拔的存储引擎体系结构,可以从运行中的 MySQL 服务器加载或卸载存储引擎。
MySQL 的 InnoDB 存储引擎是怎么设计的?[延伸阅读]
使用 EXPLAIN
分析
应该查看的一个组件是query cost
。query cost
是指MySQL根据查询执行的总开销来考虑这个特定查询的代价,并且基于许多不同的因素。
简单查询的查询开销通常小于1000
。开销在1000
到100000
之间的查询被认为是中等开销的查询,而且如果每秒只运行数百个这样的查询(而不是数万个),通常会比较快。
决定查询开销的主要因素是查询是否正确使用索引。EXPLAIN 命令可以告诉您查询是否使用索引(通常是因为索引是如何在数据库中创建的,或者查询本身是如何设计的)。
创建正确的索引
索引通过减少查询必须扫描的数据库中的数据量来提高查询效率。MySQL中的索引用于加速数据库中的访问,并帮助执行数据库约束(如 UNIQUE
和FOREIGN KEY
)。
索引良好的数据库不仅运行得更快,而且即使缺少一个索引也会使数据库慢如蜗牛。使用EXPLAIN(如前所述)查找缺少的索引并添加它们。但是要小心:不要添加你不需要的索引!不必要的索引会降低数据库的速度
拒绝使用默认设置
innodb_ buffer_ pool_size
:缓冲池用于存放缓存数据和索引. 如果您正在运行非常复杂的查询,或者有大量的并发数据库连接,或大量的表,可能需要将此值降低一个档次,以便为其他操作分配更多的内存。
innodb_ log_ file_ size
:这是单个InnoDB日志文件的大小。这个不懂
MAX_ Connections
:大型应用程序连接数通常需高于默认值。
将数据库保存在内存中
不需要将所有数据库都放入内存中,就可以获得内存中的大部分性能优势。您只需将工作数据(最频繁访问的数据)集存入内存中。
使用SSD存储
横向扩展
即使是高性能的服务器也有其局限性。有两种扩展方式:up和out。纵向扩展意味着购买更多的硬件。这可能很昂贵,而且硬件很快就会过时。横向扩展以处理更多的负载有几个好处:
1.可以利用较小且成本较低的系统。
2.通过横向扩展,进行线性扩展更快更容易。
3.因为数据库分布在多台物理机器上,所以数据库不会受到单个硬件故障点的影响。
提高MySQL性能的7个技巧
MySQL 对于千万级的大表要怎么优化?【读一遍】
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式 ) 。
第一范式:属性不可分
第二范式:非主属性只依赖于主属性
第三范式:每个非主属性都不传递依赖于R的候选键。在满足第二范式的基础上,任何非主属性不依赖于其他非主属性,即在第二范式的基础上,消除了传递依赖。
第四范式:每个表都只有一个多值事实
数据库范式-百科
数据库之六大范式详解
数据库-第一范式、第二范式、第三范式、BC范式、第四范式简析
1.有or必全有索引;???
2.复合索引未用左列字段;
3.like以%开头;
4.需要类型转换;
5.where中索引列有运算;
6.where中索引列使用了函数;
7.如果mysql觉得全表扫描更快时(数据少);
1.唯一性差;
2.频繁更新的字段不用(更新索引消耗);
3.where中不用的字段;
4.索引使用<>【不等于】时,效果一般;
MySQL索引查询失效的情况【使用不上索引的几种情况,回忆着复述一下】
索引失效分析工具:
可以使用explain命令加在要分析的sql语句前面,在执行结果中查看key
这一列的值,如果为NULL
,说明没有使用索引。
MySQL 性能优化神器 Explain 使用分析
索引的设计可以遵循⼀些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使⽤效率,更⾼效地使⽤索引。
1:最适合索引的列是出现在WHERE⼦句中的列,或连接⼦句中指定的列,⽽不是出现在SELECT关键字后的选择列表中的列。
2:使⽤唯⼀索引。 考虑某列中值的分布。索引的列的基数越⼤,索引的效果越好。例如,存放出⽣⽇期的列具有 不同值,很容易区分各⾏。⽽⽤来记录性别的列,只含有“M”和“F”,则对此列进⾏索引没有多⼤⽤处,因为不管 搜索哪个值,都会得出⼤约⼀半的⾏。
3:使⽤短索引。 如果对字符串列进⾏索引,应该指定⼀个前缀长度,只要有可能就应该这样做。例如,有⼀个 CHAR(200)列,如果在前10个或20个字符内,多数值是唯⼀的,那么就不要对整个列进⾏索引。对前10个或20个字 符进⾏索引能够节省⼤量索引空间,也可能会使查询更快。较⼩的索引涉及的磁盘 IO 较少,较短的值⽐较起来更 快。更为重要的是,对于较短的键值,索引⾼速缓存中的块能容纳更多的键值,因此,MySQL 也可以在内存中容 纳更多的值。这样就增加了找到⾏⽽不⽤读取索引中较多块的可能性。
4:利⽤最左前缀。 在创建⼀个n列的索引时,实际是创建了MySQL可利⽤的n个索引。多列索引可起⼏个索引的 作⽤,因为可利⽤索引中最左边的列集来匹配⾏。这样的列集称为最左前缀。
5:不要过度索引。 不要以为索引“越多越好”,什么东西都⽤索引是错误的。每个额外的索引都要占⽤额外的磁盘 空间,并降低写操作的性能。在修改表的内容时,索引必须进⾏更新,有时可能需要重构,因此,索引越多,所花 的时间越长。如果有⼀个索引很少利⽤或从不使⽤,那么会不必要地减缓表的修改速度。此外,MySQL 在⽣成⼀ 个执⾏计划时,要考虑各个索引,这也要花费时间。创建多余的索引给查询优化带来了更多的⼯作。索引太多,也 可能会使MySQL选择不到所要使⽤的最好索引。只保持所需的索引有利于查询优化。
6:对于InnoDB存储引擎的表,记录默认会按照⼀定的顺序保存,如果有明确定义的主键,则按照主键顺序保 存。如果没有主键,但是有唯⼀索引,那么就是按照唯⼀索引的顺序保存。如果既没有主键又没有唯⼀索引,那么 表中会⾃动⽣成⼀个内部列,按照这个列的顺序保存。按照主键或者内部列进⾏的访问是最快的,所以InnoDB表尽量⾃⼰指定主键,当表中同时有⼏个列都是唯⼀的,都可以作为主键的时候,要选择最常作为访问条件的列作为 主键,提⾼查询的效率。另外,还需要注意,InnoDB 表的普通索引都会保存主键的键值,所以主键要尽可能选择 较短的数据类型,可以有效地减少索引的磁盘占⽤,提⾼索引的缓存效果。
索引的设计和使用-很全面【可以阅读一下,尽量记忆】
MySQL索引(二)如何设计索引
与红黑树的比较:
DBA:数据库管理员(Database Administrator)
应该还是索引的设计问题
优化手段:
干掉或者利用 (limit offset,size) 中的offset。原因:如果这个offset非常大,比如几百万,那它要先找到这个位置,这比较耗费时间。
不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据
#两者用的都是一个原理嘛,所以效果也差不多
SELECT * FROM xxx WHERE ID > =(select id from xxx limit 1000000, 1) limit 20;
SELECT * FROM xxx a JOIN (select id from xxx limit 1000000, 20) b ON a.ID = b.id;
Mysql-Limit 优化【看一下前一部分的讲解就行,后边都是实验验证了】
联合索引是什么
mysql联合索引详解
主键很好,但也可以没有。
MySQL事务隔离级别和实现原理
MySQL的四种事务隔离级别
在RR的隔离级别下,Innodb使用MVCC和next-key locks解决幻读,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。
实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)
。在可重复读隔离级别下,通过多版本并 发控制(MVCC)
+ 间隙锁(Next-Key Locking)
防止幻影读。
InnoDB怎么解决幻读的
B树与B+树的解释
即数据库的日志
redo log
:
如果在内存中把数据改了,还没来得及落磁盘,而此时的数据库挂了怎么办?
redo log
的存在为了:当我们修改的时候,写完内存了,但数据还没真正写到磁盘的时候。此时我们的数据库挂了,我们可以根据redo log
来对数据进行恢复。因为redo log
是顺序IO,所以写入的速度很快,并且redo log
记载的是物理变化(xxxx页做了xxx修改),文件的体积很小,恢复速度很快。
Undo log
:
主要有两个作用:回滚和多版本控制(MVCC)
undo log
主要存储的也是逻辑日志,比如我们要insert
一条数据了,那undo log
会记录的一条对应的delete
日志。我们要update
一条记录时,它会记录一条对应相反的update
记录。
undo log
叫做回滚日志,用于记录数据被修改前的信息。
因为undo log
存储着修改之前的数据,相当于一个前版本,MVCC
实现的是读写不阻塞,读的时候只要返回前一个版本的数据就行了。
bin log
:主从复制时主数据库将操作记录到二进制bin log中
relay log
:从数据库的更新中继日志
general log
:记录所有执行过的sql
来吧,了解下MySQL有哪些log
MySQL常见的几种log
原来MySQL面试还会问这些…log(写的很好!)
MySQL中MVCC的使用及原理详解
MVCC和事务隔离级别的关系
MySQL事务与MVCC如何实现的隔离级别
这三篇看完MVCC就明白了
MySQL 事务的实现原理【不太熟悉 理解一下 认真读】
分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
分库
单台DB的存储空间不够
随着查询量的增加单台数据库服务器已经没办法支撑
问题描述【大致说一下就行】
单个表数据量越大,读写锁,插入操作重新建立索引效率越低。
单个库数据量太大(一个数据库数据量到1T-2T就是极限)
单个数据库服务器压力过大
读写速度遇到瓶颈(并发量几百)
分区和分表的区别与联系
分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
当访问量大,且表数据比较大时,两种方式可以互相配合使用。
当访问量不大,但表数据比较多时,可以只进行分区。
分库解决的问题
其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。
垂直分库–>水平分库–>读写分离
分库分表方案
分库分表后怎么查询分页?
美团文章好好看懂就行了
Leaf——美团点评分布式ID生成系统
分布式中的分库分表之后,ID 主键如何处理?
现在需要支持深分页, 页码直接跳转, 怎么实现?
【不会】
延迟的原因
一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取binlog 的线程仅有一个, 当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。
解决办法:
主服务器要负责更新操作, 他对安全性的要求比从服务器高, 所有有些设置可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog, innodb_flush_log_at_trx_commit 也 可以设置为0来提高sql的执行效率 这个能很大程度上提高效率。
把一台从服务器当度作为备份使用, 而不提供查询, 那边他的负载下来了, 执行relay log 里面的SQL效率自然就高了。
使用第三方工具进行检测,比如阿里的druid
数据库连接池,加入相关配置之后可以从面板更直观的监控sql的性能,更方便我们对问题的排查。【这个待补充】
MySQL索引原理及慢查询优化-美团技术团队
笔记上也有查询和更新的执行流程==【补充】==
可以看到:在优化器部分进行索引选择
MyISAM索引实现
—主键索引
MyISAM引擎使用B+树作为索引结果,叶节点的data域存放的是数据记录的地址。
—辅助索引
在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
InnoDB索引实现
—主键索引
同样是B+树,实现方式却完全不同。InnoDB表数据文件本身就是一个索引结构,树的叶节点data域保存了完整的数据记录,这种索引叫做聚集索引。
—辅助索引
InnoDB的所有辅助索引都引用主键作为data域。
根据in()中的内容来匹配索引,不理解的话看这篇文章中的例子。
MySQL如何遍历IN()和IN()搜索的复合B-树索引
虽然一个 CHAR
或 VARCHAR
的最大长度可以到 255,我认为大于 20 的 CHAR 是几乎用不到的――很少有大于 20 个字节长度的固定长度的东东吧?不是固定长度的就用 VARCHAR
。大于 100 的 VARCHAR
也是几乎用不到的――比这更大的用 TEXT 就好了。TINYTEXT
,最大长度为 255,占用空间也是实际长度 +1;TEXT
,最大长度 65535,占用空间是实际长度 +2;MEDIUMTEXT
,最大长度 16777215,占用空间是实际长度 +3;LONGTEXT
,最大长度 4294967295,占用空间是实际长度 +4。这些可以用在论坛啊、新闻啊,什么的,用来保存文章的正文。
TEXT
类型可以建索引,但要指定长度。
建立(name, id, age)索引
这篇文章讲了各种索引,其中就有覆盖索引,非常重要。
覆盖索引优点:
一口气搞懂MySQL索引所有知识点
Redis集群有了解吗?
Redis的索引是怎么实现的?
Redis的数据结构有哪些?内部编码是什么?选择不同内部编码的原因是什么?
Neo4j比起其他数据库的优点是什么?
Neo4j的底层实现?
Neo4j还有什么熟悉的?
redis有用过吗? 一般怎么用redis? redis的底层结构? 为什么要用redis? 持久化?
用过 Redis 的哪几种数据结构?ZSET 是怎么实现的?
zrange start, stop, 总长度为 n, 复杂度是多少?
假如用 id 翻页的方式, 数据库表如何设计? 索引如何设计?
redis用在项目的哪些地方,为什么用
redis有哪些数据类型
redis sds
redis长度过长怎么优化?哪个api,数据量超过多少效率会变低?
redis集群部署方式?主从和哨兵的区别?
缓存方式还有哪些?
redis数据结构,string底层实现,跳表复杂度?
redis使用过程中出现过变慢的情况吗?
缓存穿透?其他请求如何知道值已经到缓存中了?
redis一般怎么用的?为什么选择用redis?为什么redis快呢?
redis几种数据类型?redis string的底层实现?
分布式锁用过吗?说说怎么用的?用的哪个命令?
redis 底层 hash 表扩容机制说一下?
redis解决客户端session共享信息怎么解决的。
redis分布式锁解决了什么问题?
redis为什么能支持分布式锁?使用方式有哪些?
项目中 Redis 是怎么用的?
如果博客数据更新了,缓存怎么处理?
如果更新缓存失败了怎么办?
Redis 中有没有可能一个对象过期时间没到,就被清理掉了?
Redis分布式锁使用; 缓冲穿透;底层数据结构
Redis的结构,单线程为什么快