1.set,list,字典的底层原理以及哪个存值快,哪个取值快,为什么?
在cpython中,列表被实现为长度可变的数组,Python中的列表是由对其它对象的引用组成的连续数组。
CPython使用伪随机探测的散列表作为字典的底层数据结构。由于这个实现细节,只有可哈希的对象才能作为字典的键。
集合被实现为带有空值的字典,只有键才是实际的集合元素。
dict的查找速度和插入的速度极快,不会随key增加而变慢;但是要占用大量的内存,内存浪费多。
list正好相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
- MySQL的底层是什么?
B+Tree作为索引结构,聚簇索引每张表只有一个,叶子节点包含所有数据;辅助索引不包含所有数据;
- 联合索引和单列索引
多个单列索引在多条件查询时只会生效第一个索引!所以多条件联合查询时最好建联合索引!
最左前缀原则:
顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上,
注:如果第一个字段是范围查询需要单独建一个索引
注:在创建联合索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。这样的话扩展性较好,比如 userid 经常需要作为查询条件,而 mobile 不常常用,则需要把 userid 放在联合索引的第一位置,即最左边
- osi七层之间是怎么通信的
物理层,数据链路层(对电信号进行分组),网络层(定义了一个IP协议),传输层(建立端口到端口的通信tcp协议,udp协议),会话层,表示层,应用层(规定应用程序的数据格式)
- tcp协议使用时要注意什么
必须绑定IP和端口,其次注意沾包问题,因为tcp自带优化算法,不知道所发文件的大小产生的问题,利用python中stack这个包大包报头。
- MySQL在使用时要注意什么
建表角度:
1、合理安排表关系
2、尽量把固定长度的字段放在前面
3、尽量使用char 代替varchar
4、分表:水平分和垂直分
SQL语句的角度:
1、尽量用where来约束范围到一个比较小范围的程度,比如分页
2、尽量使用连表查询,而不是使用子查询
3、删除数据或者修改数据的时候尽量使用主键作为条件
4、合理创建和时候用索引
1、查询的条件字段不是索引字段,对哪一个字段创建了索引就对哪一个字段做条件查询。
2、在创建索引的时候应该对区分度比较大的列进行创建1/10以下的重复率比较适合创建索引。
3、范围
范围越大越慢
范围越小越快
!= 慢
like 'a%' 快
like '%a' 慢
4、条件列参与计算/使用函数
5、and 和 or
多个条件的组合,如果使用and连接,其中一列含有索引,都可以加快查找速度。
如果使用or连接,必须所有的列都含有索引,才能加快查询速度。
6、联合索引 (最左前缀原则)必须带这最左边的列作为条件,从出现范围开始整条索引失效。
7、条件中写出来的数据类型必须和定义的数据类型一致。
8、select的字段应该包含order by的字段。