数据库灵魂10问
1.索引的目的是什么?
快速访问数据表中的特定信息,提高检索速度
创建唯一性索引,保证数据库表中每一行数据的唯一性。
加速表和表之间的连接
使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
2.索引对数据库系统的负面影响是什么?
创建索引和维护索引需要耗费时间,索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
3.为数据表建立索引的原则有哪些?
在最频繁使用的、用以缩小查询范围的字段上建立索引。
在频繁使用的、需要排序的字段上建立索引
4.什么情况下不宜建立索引?
对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
5.优化数据库的方法
选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如’省份’、’性别’最好适用ENUM
使用连接(JOIN)来代替子查询
适用联合(UNION)来代替手动创建的临时表
事务处理
锁定表、优化事务处理
适用外键,优化锁定表
建立索引
优化查询语句
6说说对SQL语句优化有哪些方法?(选择几条)
Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。
用EXISTS替代IN、用NOT EXISTS替代NOT IN。
避免在索引列上使用计算
避免在索引列上使用IS NULL和IS NOT NULL
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
7.如何通俗地理解三个范式?
答:第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。。
8.范式化设计优缺点?
优点:
可以尽量得减少数据冗余,使得更新快,体积小
缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化
反范式化:
优点:可以减少表得关联,可以更好得进行索引优化
缺点:数据冗余以及数据异常,数据得修改需要更多的成本
9.什么情况下设置了索引但无法使用
以“%”开头的LIKE语句,模糊匹配
OR语句前后没有同时使用索引
数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
10.锁的优化策略
读写分离
分段加锁
减少锁持有的时间
多个线程尽量以相同的顺序去获取资源
不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。
- java数据库编程(10) 离线RowSet
- python学习笔记10:Access数据库转换为SQLite数据库之前的准备
- 关于数据库设计的 10+条建议
- Android:日常学习笔记(10)———使用LitePal操作数据库
- 数据库常规Top 10
- 在solaris 10上安装oracle 10g数据库
- java实验10-java数据库编程
- postgresql10数据库之模式
- Postgresql10数据库之创建数据库
- Oracle 10数据库迁移
- 数据库笔记10:插入数据 创建和操纵表
- Oracle中对数据库表数据进行分段查询:10~50之间的数据
- exp-00003的错误|如何从oracle10备份导入到oracle9 数据库中|如何从oracle的高版本备份导入到低版本中
- 在 Linux 服务器上部署 oracle10gr2 数据库全过程
- Yii2.0-advanced-10—数据库操作2(查询构建器)
- DeepLearning (五) 基于Keras的CNN 训练cifar-10 数据库
- Yii2.0-advanced-10—数据库操作6(读写分离-数据库主从配置)
- window xp PHP5.2.17 apache2.2 mysql eclipse 数据库连接(mysql,oracle10)
- 基于DragonBoard 410c的家庭智能环保卫士——(10)数据库python代码实现
- Cygwin&Vim搭建Mainframe IDE(10)---Vim中访问数据库,执行SQL