Python面试之同花顺Python开发工程师(一面)

同花顺的一面相对简单,是通过电话面试的,对面的小哥哥感觉很不错,给我讲了很多的东西和以后需要提高的方面:下面做个见得总结:

     面试面容主要两个方面:一个方面是python方面,另一个方面是数据库方面。

     Python方面主要是和Python基础相关的东西,就不在赘述了,有兴趣和可以参考一下本人的其他博文。需要特别说明的是,需要了解scrapy框架的基本原理。

     主要介绍一下数据库方面的问题:

     

 

mysql :简单的增删除改查就不在赘述,说一下理论的东西:

     1、事务:Python数据分析师面试之“完美世界”数据分析师实习生

    其他补充:

           

2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别

脏读:事务B读取事务A还没有提交的数据 
不可重复读:两次事务读的数据不一致 
幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看来,明明修改了数据,昨不一样, 
隔离级别 读数据一致性 脏读 不可重复读 幻读 
未提交读 最低级别 是 是 是 
已提交读 语句级 否 是 是 
事务级 事务级 否 否 是 
串行化 最高级别 否 否 否

3.MYSQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景 
MYISAM 不支持事务,不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描 
INNODB 支持事务,支持外键,行锁,查表总行数时,全表扫描

4.索引有B+索引和hash索引,各自的区别 
hash索引,等值查询效率高, 
不能排序 
不能进行范围查询

B+索引 
数据有序 
范围查询

5.B+索引数据结构,和B树的区别

1.单一节点存储更多的元素,B+树空间利用率更高,使得查询的IO次数更少。 
2.所有查询都要查找到叶子节点,查询性能稳定。 
3.所有叶子节点形成有序链表,便于范围查询

6.索引的底层实现(B+树,为何不采用红黑树,B树) 
增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间 
B树,查询性能不稳定,查询结果高度不致, 
B树,每个结点保存指向真实数据的指印,相比B+树每一层每屋存储的元素更多,显得更高一点。

7.聚集索引和非聚集索引区别 
聚集索引,数据按索引顺序存储,中子结点存储真实的物理数据 
非聚集索引,存储指向真正数据行的指针

8.索引的优缺点,什么时候使用索引,什么时候不能使用索引(重点) 
索引最大的好处是提高查询速度, 
缺点是更新数据时效率低,因为要同时更新索引 
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。

9.B树,也是B-树 
先看二叉查找树,时间复杂度log(n),考虑磁盘IO,所以需要二叉查找树矮宽,减小树的高度。 
1.根结点至少有两个子女。 
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m 
4.所有的叶子结点都位于同一层。 
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划 
k的大小取决于磁盘页的大小,主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常, 
此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

10.InnoDB索引和MyISAM索引的区别: 
一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。 
二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

11.为什么使用B-/+Tree 
索引查找过程中就要产生磁盘I/O消耗,主要看IO次数,和磁盘存取原理有关。 
根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理, 
将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入 
局部性原理与磁盘预读

12.B+树具体实现 
一个m阶的B+树具有如下几个特征: 
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。 
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素

13.数据库的优化(一条sql中能使用一个索引,多个索引会自动选择最优的索引,从sql语句优化和索引两个部分回答) 
原则1.sql尽量使用索引 
2.对sql语句优化 
子查询变成left join 
limit 分布优化,先利用ID定位,再分页 
or条件优化,多个or条件可以用union all对结果进行合并(union all结果可能重复) 
不必要的排序 
where代替having,having 检索完所有记录,才进行过滤 
避免嵌套查询 
对多个字段进行等值查询时,联合索引

14.是否使用索引explain查看查询计划

15.索引最左前缀问题 
如果对三个字段建立联合索引,如果第二个字段没有使用索引,第三个字段也使用不到索引了。 
16.索引分类,索引失效条件 
普通索引:最基本的索引,没有任何限制 
唯一索引:与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。 
主键索引:它是一种特殊的唯一索引,不允许有空值。 
全文索引:针对较大的数据,生成全文索引很耗时好空间。 
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则 
失效条件 
条件是or,如果还想让or条件生效,给or每个字段加个索引 
like查询,以%开发 
内部函数 
对索引列进行计算 
is null不会用,is not null 会用

16.数据库的主从复制 
默认异步复制,容易造成主库数据和从库不一致 
一个数据库为Master,一个数据库为slave,通过Binlog日志 
slave两个线程,一个线程去读master binlog日志,写到自己的中继日志 
一个线程解析日志,执行sql 
master启动一个线程 
给slave传递binlog日志

半同步复制 
只有把master发送的binlog日志写到slave的中继日志,这时主库 
才返回操作完成的反馈,性能有一定降低

并行复制 
slave 多个线程去请求binlog日志

17.long_query怎么解决 
设置参数,开启慢日志功能,得到耗时超过一定时间的sql

18.varchar和char的使用场景 
用来存储字符 
varchar适用字符长度经常变的 
char适用字符长度固定的

19.数据库连接池的作用 
维护一定数量的连接,减少创建连接的时间 
更快的响应时间 
统一的管理

20.分库分表,主从复制,读写分离 
读写分离,读从库,写主库 
spring配置两个数据库,通过AOP(面向切面编程),在写或读方法前面进行判断得到动态切换数据源。

21.数据库三范式 
1NF 属性不可分 
2NF 非主键属性,完全依赖于主键属性 
3NF 非主键属性无传递依赖

22.关系型数据库和非关系型数据库区别 
数据库 
类型 特性 
关系型数据库mysql

1、关系型数据库,是指采用了关系模型来组织数据的数据库, 
2.关系型数据库的最大特点就是事务的一致性;

                    优点
                  1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
                  2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
                  3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
                  4、支持SQL,可用于复杂的查询。 
                     缺点
                  1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
                  2、固定的表结构;
                  3、不支持高并发读写需求;
                  4、不支持海量数据的高效率读写;

非关系型数据库 特性 
HBase

1、使用键值对存储数据; 
2、分布式; 
优点 
无需经过sql层的解析,读写性能很高 
基于键值对,数据没有耦合性,容易扩展 
存储数据的格式:nosql的存储格式是key,value形式 
缺点 
不支持事务 
不提供sql支持

23.数据库中join的inner join, outer join, cross join 
以A,B两张表为例 
A left join B 
选出A的所有记录,B表中没有的以null 代替 
right join 同理

inner join 
A,B的所有记录都选出,没有的记录以null代替

cross join (笛卡尔积) 
A中的每一条记录和B中的每一条记录生成一条记录 
例如A中有4条,B中有4条,cross join 就有16条记录

24.有哪些锁,select时怎么加排它锁 
乐观锁,自己实现,通过版本号 
悲观锁:共享锁,多个事务,只能读不能写,加 lock in share mode 
排它锁,一个事务,只能写,for update 
行锁 
表锁 
25.死锁怎么解决 
找到进程号,kill 进程

26 最左匹配原则 
最左匹配原则是针对索引的 
举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,这里我们可以简单的理解为先是对name字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,查询条件where name=’xxx’ and age=xx 这时的话,就利用到索引了,再来思考下where age=xx and name=’xxx‘ 这个sql会利用索引吗,按照正常的原则来讲是不会利用到的,但是优化器会进行优化,把位置交换下。这个sql也能利用到索引了

 

 

mongodb数据库:

 1、基本的存储形式:(由于本人主流语言是Python,故以Python为例),主要存储形式按照json形式存储,操作相对方便。  

2、mongodb数据库每个集合的插入是有大小限制的,你知道是多大么?

          BSON文档:单个Bson文档最大为16M。该限制是为了保证单个文档不会占用过多RAM、在网络传输过程中不会占用过多带宽。MongoDB提供了GridFS来保存超过该限制的文档。具体可参考mongofiles。Bson文档的最深内嵌深度为100。

          命名空间(namespaces):每个命名空间长度必须小于123 bytes。命名空间的数量为命名空间文件大小(字节数)/628。一个16M的命名空间文件可以保存大约24000个命名空间。每一个集合和索引都是一个命名空间命名空间文件大小必须小于2047M,默认为16M,可以使用nsSize属性配置。

           索引:索引键限,索引条目的大小不得超过1024bytes。

 

 

       mongodb和mysql两种数据库你更喜欢用哪一种?为什么,或者说你认为mysql或者mongodb对你来说有什么不好用的地方?

          
 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值