yter1  

Mysql

为什么要使用索引,使用索引有什么好处?

索引中有唯一索引的存在,可以降低数据查找的效率。索引本质上是通过优化数据结构去优化查找效率的。Mysql中的inodb引擎就是通过B+树去实现索引的,我们知道B+树是除了叶子节点存储数据,其他节点都只存储键的,这样我们进行范围查数据和全文查数据以及并行查找时候,使得锁竞争只存在于叶子节点中。举user表,表中包含userid和name。将这张表变成B+树进行分析。
关系型数据库本来就是按照一定的数据关系模型,然后构建数据与数据之间的羁绊,使得随机IO查询变为了顺序IO查询。

mysql的优化

  • 尽量避免全表查询,join查询,使用索引查询,列出查询字段,右键设计表可以查看到索引,或者show index 表也可以查看索引
  • 选择正确的引擎,都是B+树结构的实现,区别在于索引文件与数据文件是否分离,事务提交使用inodb,myisam不适应,indb的锁粒度是行级锁,myisam是表锁,所以对于查询频繁选myisam,对于插入数据执行事务提交回滚频繁就使用inodb。
  • 为搜索字段创建合适的索引,对于单条记录查询就建立哈希索引,对于按索引值算法去查询的就使用BTree索引。索引的目的是无序变有序,使得查询带目的。比如无序数中查10-3和有序数中查,哪个算法更快。
  • 主从库读写分离,主库写,多个从库进行分布式读。
  • 添加缓存机制,比如redis、memcache
  • 书写高效sql语句查询,慢sql就去查slow_query_log(SHOW VARIABLES LIKE 'slow_query_log_file';),也可以辅助使用explain 去解析sql执行速度啊,使用了哪些索引啊去优化sql,比如:explain select NAME='xxx' from table;查询结果得type不为all那就是使用了索引字段,当然也可以强制使用索引去进行查询;
  • 进行分库分表,分库是将一个表分在多个库,分散请求压力,读表的压力;分表是将表间关联性加强,增加索引,提升写的效率。
  • 优化数据结构,限定数据的查询范围

mysql 的acid

原子性 一致性 封闭性 持久性 的实现原理就是通过事务 + undolog实现的
事务执行开始,记录log,事务内的每一个操作都记录log,

为什么mysql引擎不使用B树或者红黑树,反而选择B+树?

因为B树的树高不满足条件,树高具体是多高呢?logn 只是大概,决定着IO的次数,查询效率;
操作系统设置的一页一般是4k,B+树的一个节点存的就是一个key值 ,也就是一个inode索引节点大小的物理页;
对于非叶子节点,存的是key值,key使用的是bigint 也就是double int int=4字节,so 8字节的,指针在mysql中是6字节,加起来就是14字节,4k1024 /14B = 585 个inode索引指针了,一个B+树的节点就能存500来个inode节点。
对于叶子节点,就是一行数据1k,那么一页就能存4条数据。4
585 = 2350条
一般高度为3层的B+树就能解决了,5千多w条数据。
B+树是叶子节点存data,非叶子节点就是存key值,节点的大小不一样,而且找data也是二分查找的

mysql的引擎有?

inodb 行锁 字段锁 读写少多 默认都是使用的这个 事务型,可支持事务提交和rollback 本身就是一个索引文件,索引与数据不分开
myisam 表锁 读多写少

mysql的事务隔离级别?会产生什么影响呢?

未提交读,会导致脏读 幻读 不可重复读
已提交读,可以阻止脏读 但是幻读和不可重复读不可避免
可重复读,可以阻止脏读和不可重复读,但幻读仍有可能发生
可串行化读,该级别可以防止脏读、不可重复读以及幻读

索引主要使用的数据结构

哈希索引 查单条记录
Btree索引 其余查询场景

数据库优化

分库分表主要是用在处理高并发场景下的优化策略,像互联网高并发场景,千万级别用户,比如12306,几亿级用户量的用户信息,当db查询打过来时候,一个表1亿数据肯定是不行的。
游戏服务器大致不需要这种,游戏服数据量小。分库是把相同的功能模块的访问量分散到不同库中,提高读的性能,分表是为了加强表间关联性,创建更多唯一性索引,加快sql IO查询速度,提高写的性能。

为什么epoll 要使用红黑树,为什么map和set容器要使用红黑树

红黑树红黑可以代表2个状态,但是最重要的还是他们插入时候,红黑树是在插入过程进行调整,且Olgn完成插入,io效率就更高;二叉平衡查找树是左右差值高度为1的树,左节点《父节点《右节点;插入完后才去根据这一特性进行调整,就很慢好吧
Mysql的索引B+树

redis

redis与memcache的区别?

  • memcache 只支持string 相反redis 支持除string外的zset set hash list 4种数据结构
  • redis是使用跳表实现的,扩容机制是怎么样的?rehash过程是怎么样的?
  • hash 是数组+链表实现
  • memcache 不支持数据持久化,redis支持数据持久化,提供了RDB(快照)、 AOF(录像) 和2者混合(先快照后录像)3种持久化技术
  • 2者的IO模型不一样:memcache 是多线程的非阻塞 的IO复用技术,redis是基于单线程的非阻塞IO多路复用技术
  • string 数据结构适用于游戏中的点赞数性质的,票数,粉丝数 这种累加性质的 ; hash 主要是用来存储键值快速获取信息的,比如用户信息,商品信息,玩法数据 ; list 可以做高性能分页功能 ; set可以做共同关注,共同好友
  • redis 的zset是使用跳表实现的,跳表是带索引的链表,lru是哈希数组索引(01查找)+链表(01删除)

Redis 如何实现数据不丢失?

主从redis服务器

redis的缓存雪崩 和 缓存击穿

posted on 2025-04-16 14:53  花生米与花生酱  阅读(20)  评论(0)    收藏  举报