数据库常见问题总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据库常见问题总结
1.常见的关系型数据库和⾮关系型数据库?
关系型数据库(需要表结构):sqllite、db2、oracle、access、SQLserver、MySQL
⾮关系型数据库(key-value结构存储,没有表结构):mongodb、redis、memcache
2.常见的数据库引擎⽐较?
1>.InnoDB⽀持事物,⽽MyISAM不⽀持事物
2>.InnoDB⽀持⾏级锁,⽽MyISAM⽀持表级锁
3>.InnoDB⽀持MVCC, ⽽MyISAM不⽀持
4>.InnoDB⽀持外键,⽽MyISAM不⽀持
5>.InnoDB不⽀持全⽂索引,⽽MyISAM⽀持。

3.数据库设计三⼤范式
第⼀范式:1NF是对属性的原⼦性约束,要求属性具有原⼦性,不可再分解;
第⼆范式:2NF是对记录的惟⼀性约束,要求记录有惟⼀标识,即实体的惟⼀性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派⽣出来,它要求字段没有冗余范式化设计优缺点:
优点:可以尽量得减少数据冗余,使得更新快,体积⼩
缺点:对于查询需要多个表进⾏关联,减少写得效率增加读得效率,更难进⾏索引优化
4.事务,以及mysql如何⽀持事务?
'什么是事务'
事务由⼀个或多个sql语句组成⼀个整体;
在事务中的操作,要么都执⾏修改,要么都不执⾏,
只有在该事务中所有的语句都执⾏成功才会将修改加⼊到数据库中,否则回滚到上⼀步。

'Mysql实现事务'
InnoDB⽀持事务,MyISAM不⽀持
# 启动事务:
# start transaction;
# update from account set money=money-100 where name='a';
# update from account set money=money+100 where name='b';
# commit;
'start transaction ⼿动开启事务,commit ⼿动关闭事务'
5.数据库五⼤约束
主键约束 primary key
默认值约束 default
唯⼀约束 unique
⾮空约束not null
外键约束 foreign key
6.mysql索引种类
'主键索引(单列)':
primary key
加速查找+约束:不能重复、不能为空
'普通索引(单列)':
加速查找
'唯⼀索引(单列)':
unique
加速查找+约束:不能重复
'联合索引(多列)':
查询时根据多列进⾏查询(最左前缀)
'联合唯⼀索引(多列)':
遵循最左前缀规则(命中索引)
# 其他词语
1、索引合并:利⽤多个单列索引查询
2、覆盖索引:在索引表中就能将想要的数据查询到
7.索引什么情况下遵循最左前缀原则
联合索引A,B,C,D
只要出现A,不管顺序如何都会使⽤索引;只要没有A,就不会使⽤索引;
具体⽤法参考博客:
8.创建索引但是⽆法命中索引的8种情况
#使⽤'like ‘%xx’'
select * from tb1 where name like '%cn';
#使⽤'函数'
select * from tb1 where reverse(name)='zgc';
#使⽤'or'
select * from tb1 where nid=1 or email='zgc@';
特别的:当or条件中有未建⽴索引的列才失效,⼀下会⾛索引
# select * from tb1 where nid=1 or name='zgc';
# select * from tb1 where nid=1 or email='zgc@' and name='zgc'; #'类型不⼀致'
如果列是字符串类型,传⼊条件是必须⽤引号引起来,不然则可能会⽆法命中 select * from tb1 where name=666;
#含有'!= '
select * from tb1 where name != 'zgc';
特别的:如果是主键,还是会⾛索引
# select * from tb1 where nid != 123;
#含有'>'
select * from tb1 where name > 'zgc';
特别的:如果是主键或者索引是整数类型,则还是会⾛索引
# select * from tb1 where nid > 123;
# select * from tb1 where name > 123;
#含有'order by'
select email from tb1 order by name desc;
当根据索引排序时,选择的映射如果不是索引,则不⾛索引
特别的:如果对主键排序,则还是⾛索引:
# select * from tb1 order by nid desc;
#组合索引最左前缀
如果组合索引为:(name,email)
name and email #使⽤索引
name #使⽤索引
email #不使⽤索引
9.开启慢⽇志查询
'可以通过修改配置⽂件开启'
slow_query_log=ON #是否开启慢⽇志记录
long_query_time=2 #时间限制,超过此时间,则记录
slow_query_log_file=/usr/slow.log #⽇志⽂件
long_queries_not_using_indexes=ON #是否记录使⽤索引的搜索
1、创建数据表时把固定长度的放在前⾯
2、将固定数据放⼊内存:choice字段(django中⽤到,1,2,3对应相应内容)
3、char不可变,varchar可变
4、联合索引遵循最左前缀(从最左侧开始检索)
5、避免使⽤ select *
6、读写分离:
#利⽤数据库的主从分离:主,⽤于删除、修改、更新;从,⽤于查
#实现:两台服务器同步数据
\原⽣SQL:select * from db.tb
\ORM:er.object.all().using('default')
\路由:d b router
7、分库
# 当数据库中的表太多,将某些表分到不同数据库,例如:1W张表时
# 代价:连表查询跨数据库,代码变多
8、分表
# ⽔平分表:将某些列拆分到另⼀张表,例如:博客+博客详情
# 垂直分表:将某些历史信息,分到另外⼀张表中,例如:⽀付宝账单
9、加缓存
# 利⽤redis、memcache(常⽤数据放到缓存⾥,提⾼取数据速度)
# 缓存不够可能会造成雪崩现象
10、如果只想获取⼀条数据
select * from tb where name = 'zgc' limit 1;
11.1000w条数据,使⽤limit offset 分页时,为什么越往后翻越慢?如何解决?
# 例如:
#limit 100000,20; 从第⼗万条开始往后取⼆⼗条,
#limit 20 offset 100000; limit后⾯是取20条数据,offset后⾯是从第10W条数据开始读
因为当⼀个数据库表过于庞⼤,LIMIT offset, length中的offset值过⼤,则SQL查询语句会⾮常缓慢
--------------------------------------------------------------------------
'优化⼀'
先查看主键,再分页:
select * from tb where id in (select id from tb where limit 10 offset 30)
--------------------------------------------------------------------------
'优化⼆'
记录当前页,数据、ID、最⼤值和最⼩值(⽤于where查询)
在翻页时,根据条件进⾏筛选,筛选完毕后,再根据 limit offset 查询
select * from(select * from tb where id > 2222) as B limit 10 offset 0;
\如果⽤户⾃⼰修改页码,也可能导致变慢,此时可以对 url 页码进⾏加密,例如rest framework
--------------------------------------------------------------------------
'优化三'
可以按照当前业务需求,看是否可以设置只允许看前200页;
⼀般情况下,没⼈会咔咔看个⼏⼗上百页的;
12.什么是索引合并?
索引合并,让⼀条sql可以使⽤多个索引。

对这些索引取交集,并集,或者先取交集再取并集。

从⽽减少从数据表中取数据的次数,提⾼查询效率。

13.数据库读写分离?
利⽤数据库主从分离,主⽤来进⾏数据库的增添,修改,和删除操作(INSERT、UPDATE、DELETE)。

从⽤来进⾏查找操作(SELECT)
两台数据库来同步数据,从⽽减轻服务器压⼒
14.数据路分库分表操作?
# 1、分库
当数据库中的表太多,将某些表分到不同数据库,例如:1W张表时
代价:连表查询跨数据库,代码变多
# 2、分表
⽔平分表:将某些列拆分到另⼀张表,例如:博客+博客详情
垂直分表:将某些历史信息,分到另外⼀张表中,例如:⽀付宝账单
15.如何设计⼀个⾼并发的系统?
数据库优化,sql语句优化,索引优化
使⽤缓存,减少数据库IO操作
分布式数据库,分布式缓存(减轻服务器的压⼒)
服务器的负载均衡
16.锁的优化策略?
①读写分离
②分段加锁
③减少锁持有的时间
④多个线程尽量以相同的顺序去获取资源
等等,这些都不是绝对原则,都要根据情况,⽐如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反⽽效率不如⼀次加⼀17.索引的底层实现和原理?
B+树。

在所有的叶⼦结点中增加了指向下⼀个叶⼦节点的指针
18.实践中如何优化mysql?
sql语句及索引的优化
表结构优化
系统配置优化
硬件优化
19. 简单描述mysql中,索引,主键,唯⼀索引,联合索引的区别,对数据库的性能有什么影响
(1)索引是⼀种特殊的⽂件(InnoDB数据表上的索引是表空间的⼀个组成部分),它们包含着对数据表⾥所有记录的引⽤指针。

(2)普通索引(由关键字KEY或INDEX定义的索引)的唯⼀任务是加快对数据的访问速度。

(3)普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列只包含彼此各不相同的值,在为这个数据索引创建索引的时候就应该⽤关键字UNIQE把它定义为
⼀个唯⼀所以,唯⼀索引可以保证数据记录的唯⼀性。

(4)主键,⼀种特殊的唯⼀索引,在⼀张表中只能定义⼀个主键索引,逐渐⽤于唯⼀标识⼀条记录,是⽤关键字PRIMARY KEY来创建。

(5)索引可以覆盖多个数据列,如像INDEX索引,这就是联合索引。

(6)索引可以极⼤的提⾼数据的查询速度,但是会降低插⼊删除更新表的速度,因为在执⾏这些写操作时,还要操作索引⽂件。

20.什么是锁?
数据库是⼀个多⽤户使⽤的共享资源。

当多个⽤户并发地存取数据时,在数据库中就会产⽣多个事务同时存取同⼀数据的情况。

若对并发操作不加控制就可能会读取和
存储不正确的数据,破坏数据库的⼀致性。

加锁是实现数据库并发控制的⼀个⾮常重要的技术。

当事务在对某个数据对象进⾏操作前,先向系统发出请求,对其加锁。

加锁后事务就对该数据对象有了⼀定的控
制,在该事务释放锁之前,其他的事务不能对此数据对象进⾏更新操作。

基本锁类型:锁包括⾏级锁和表级锁。

相关文档
最新文档