admin管理员组

文章数量:1531659

2024年5月23日发(作者:)

2020年阿里精选面试题及答案

1. 使用mysql索引都有哪些原则?索引什么数据结构?

B+tree和B tree什么区别?

1、 对于查询频率高的字段创建索引;

2、 对排序、分组、联合查询频率高的字段创建索引;

3、 索引的数目不宜太多

原因:a、每创建一个索引都会占用相应的物理控件;

b、过多的索引会导致insert, update、delete语句的执行效率降低;

4、 若在实际中,需要将多个列设置索引时,可以采用多列索引

如:某个表(假设表名为Student),存在多个字段(StudentNo, StudentName, Sex,

Address, Phone, BirthDate),其中需要71 StudentNo, StudentName 字段进行查询,对

Sex字段进行分组,对BirthDate字段逹行排序,此时可以创建多列索引index

index_najne (StudentNo,

S

tudentName,

S

ex, BirthDate) ;#index_najne 为索引名

在上面的语句中只创建了一个索引,但是对4个字段都赋予了豪引的功能。 创建多列

索引,需要遵循BTree类型,即第一列使用时,才启用索引。

在上面的创建语句中,只有mysql语句在使用到StudentNo字段时,索引才会被启 用。

如: select * from Student wheie StudentNo = 1000; #使用到了 StudentNo 字段,

索引被启用。

以使用explain检测索引是否被启用如:explain select * from Student where

StudentNo = 1000;

5、 选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生 表中

学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的 信息。如果

使用姓名的话,可能存

6、 尽量使用数据量少的索引

如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR (100)类型的 字

段进行全文检索

需要的时间要多。

7、 尽量使用前缀来索引

如果索引字段的值很长,最好使用催的前缀来索引。例如,TEXT和BLOG类型的字 段,

进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提 高检索速度。

8、 删除不再使用或者很少使用的索引.

表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再 需要。

数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作 的影响B+ tree

树索引,B tree,散列

需要的时间肯定要比对CHAR (10)类型的字段

在同名现象,从而降低查询速度。

2. Mysql有哪些存储引擎?请详细列举其区别?

InnoDB:事务型存储引擎,并且有较高的并发读取频率 MEMORY:存储引擎,存放在内存

中,数据量小,速度快

Merge:

ARCHIVE:归档,有很好的压缩机制

3. 设计高并发系统数据库层面该如何设计?数据库锁有哪

些类型?如何实现?

1. 分库分表:同样量的数据平均存储在不同数据库相同表(或不同表)中,减轻单表 压

力,如果还是很大,就可以每个库在分多张表,根据hash取值或者其他逻辑判断将 数据

存储在哪张表中

2. 读写分离:数据库原本就有主从数据库之分,查询在从服务器

増删改在主服务器

3. 归档和操作表区分:建一张归档表,将历史数据放入,需要操作的表数据单独存储

4. 索引啊之类的创建,对于数据量很大,百万级别以上的单表,如果増删改操作不频 繁

的话

可以创建bitMap索引,速度要快得多

1. 共享锁:要等第一个人操作完,释放锁,才能操作

2. 更新锁:解决死锁,别人可以读,但不能操作

3. 排他锁:读写都被禁用

4. 意向锁(xlock):对表中部分数据加锁,查询时,可以跳过

5. 计划锁:操作时,别的表连接不了这张表,

4. 数据库事务有哪些?

原子性:所有操作要么全部成功,要么全部失败

—致性:例如转账,一个事务执行前和执行后必须一致 隔离性:防止脏读,重复读问题

持久性:永久性提交数据応

5. Oracle常用函数有哪些?

Concat:字符串拼接,或者|| KConcat:字符串拼接,或者|| Instr:指定字符串位置

Length:长度

Trim:去空格

Lower:小写

Upper:大写

Nvl:判断空

Replace:替换

Substr:截取

Floor:向下取整

To_nmber:

To_char:

To_date:

Decode:判断函数等等

中哪些情况可能不会走索引?

1.

2.

3.

4.

5.

6.

7.

8.

查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索 引

单键值的b树索引列上存在null值,导致COUNTS)不能走索引。索引列存在空 值

索引列上有函数运算,导致不走索引

隐式类型转换导致不走索引。

表的数据库小或者需要选择大部分数据,不走索引

!=或者◊(不等于),可能导致不走索引

表字段的属性导致不走索引,字符型的索引列会导致优化器认为需要扫描索引大 部分

使用like, in等,可能导致不走素引

数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式,

7. 讲讲分布式唯

ID?

确定ID存储用64位,1个64位二进制6是这样的00000000……1100 ........ 0101,切

割64位,某段二进制表示成1个约束条件,前41位为臺秒时间,后紧接9位为IP, IP之

后为自増的二进制,记录当前面位数相同情况下是第几个id,如现在有10台机器, 这个id

生成器生成id极限是同台机器Ims内生成2的14次方个ID。

分布式唯一ID =时间戳« 41位,int类型服务器编号« 10,序列自増sequence o 每个时间

戳内只能生成固定数量如(1。万)个自増号,达到最大值则同步等待下个时 间戳,白増从。

开始。将臺秒数放在最高位,保证生成的ID是趋势逢増的,每个业务 统、每个机房、每个

机器生成的ID都是不同的。如39bit臺秒数|4bit业务线12bit 机房I预留17bit序列号。

高位职2016年1月1耳1到现在的臺秒数,系统运行1曾, 至少需要10年x365天x24小

时x3600愁xl000臺秒=320x10^9,差不多39bit给臺秒 数,每秒单机高峰并发小于10。,

差不多7bit给每臺秒的自増号,5年内机房小于100 台机器,预留2bit给机房,每个机房

小二100台机器,预留7bit给每个机房,业务线 小于10个,预留4bit给业务线标识。

64bit分布式ID (42bit臺秒+5bit机器ID+12位自増)等

生成分布式ID的方式:A, 2个自増表,步长相互隔开B,时间的臺秒或者纳秒C, UUID D,

64位约束条件(如上)

本文标签: 导致使用需要操作数据