-
Reactor和Proactor的区别
Reactor采用同步IO,用户层执行IO操作时,处于挂起状态,等待内核层完成。Proactor采用异步IO,用户层执行IO操作时,可以一边等待内核操作IO,一边自己去处理其他事情。等内核操作IO结束后,用户层被唤醒。
Reactor模式的读取操作:1) 应用程序注册读就需事件和相关联的事件处理器。2) 事件分离器等待事件的发生。3) 当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器。4) 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理。
Proactor模式的读取操作:1) 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。2) 事件分离器等待读取操作完成事件。3) 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。4) 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。 -
TCP的状态迁移
-
数据库中一般把索引建在什么字段比较合适
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
链接 -
什么时候适用索引
1)字段有唯一性限制的
2)经常用于where查询条件的字段,这样能够提高整个表的的查询速度,如果查询条件不是一个字段,可以建立联合索引
3)经常用于order by和order by的字段,这样在查询的时候就不需要再去做一次排序了,因为我们都知道了建立索引之后在B+tree中的记录都是排序好的。 -
建立索引的目的
索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象的就是索引是数据的目录。加快查找速度 -
什么字段不适合建立索引
1)频繁更新的字段不适合建立索引
2)where条件中用不到的字段不适合建立索引
3)可以确定表数据比较少不需要建立索引
4)数据重复且发布比较均匀的字段不适合建索引(如性别,真假值)
5)参与列计算的列不适合建索引 -
什么时候不适合索引
1)WHERE 条件,GROUP BY,ORDER BY 里用不到的字段,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的,因为索引是会占用物理空间的。
2)字段中存在大量重复数据,不需要创建索引,比如性别字段,只有男女,如果数据库表中,男女的记录分布均匀,那么无论搜索哪个值都可能得到一半的数据。在这些情况下,还不如不要索引,因为 MySQL 还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
3)表数据太少的时候,不需要创建索引;
4)经常更新的字段不用创建索引,比如不要对电商项目的用户余额建立索引,因为索引字段频繁修改,由于要维护 B+Tree的有序性,那么就需要频繁的重建索引,这个过程是会影响数据库性能的。 -
索引失效的情况
1)对索引使用左或者模糊匹配
2)对索引使用函数
3)对索引进行表达式计算
4)对索引隐式类型转换
5)联合索引非最左匹配
6)where子句中的or
奇安信服务端开发工程师二面
最新推荐文章于 2023-06-28 23:06:20 发布