热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql数据库面试总结(一)

1、数据库优化1)数据库范式第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。如电话列可进行

1、数据库优化 

1)数据库范式

  第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。

  如电话列可进行拆分---家庭电话、公司电话

  第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

  

  第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。 

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)

拆开来,如下。

(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

满足这些规范的数据库是简洁的、结构明晰的;同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。  

2)数据类型选择

  数字类型:   

Float和double选择(尽量选择float)

区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义

能够用数字类型的字段尽量选择数字类型而不用字符串类型的

字符类型

  char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用 CHAR 类型(填空格),不定长字段尽量使用 VARCHAR(自动适应长度,超过阶段),且仅仅设定适当的最大长度

时间类型

  按选择优先级排序DATE(精确到天)、TIMESTAMP、DATETIME(精确到时间)

ENUM

  对于状态字段,可以尝试使用 ENUM 来存放

 避免使用NULL字段,很难查询优化且占用额外索引空间

 

 

3)字符编码

    同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。  

1.纯拉丁字符能表示的内容,选择 latin1 字符编码

2.中文可选用utf-8

3.MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作次数并提高缓存命中率

 

 

2、Sql优化 

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

3.应尽量避免在 where 子句中使用!&#61;或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t where num&#61;10 or num&#61;20
可以这样查询&#xff1a; select id from t where num&#61;10 union all select id from t where num&#61;20 5.in 和 not in 也要慎用&#xff0c;否则会导致全表扫描&#xff0c;如&#xff1a; select id from t where num in(1,2,3)
对于连续的数值&#xff0c;能用 between 就不要用 in 了&#xff1a; select id from t where num between 1 and 3 6.下面的查询也将导致全表扫描&#xff1a; select id from t where name like &#39;%abc%&#39; 7.应尽量避免在 where 子句中对字段进行表达式操作&#xff0c;这将导致引擎放弃使用索引而进行全表扫描。如&#xff1a; select id from t where num/2&#61;100
应改为: select id from t where num&#61;100*2 8.应尽量避免在where子句中对字段进行函数操作&#xff0c;这将导致引擎放弃使用索引而进行全表扫描。如&#xff1a; select id from t where substring(name,1,3)&#61;&#39;abc&#39;--name以abc开头的id
应改为: select id from t where name like &#39;abc%&#39; 9.不要在 where 子句中的“&#61;”左边进行函数、算术运算或其他表达式运算&#xff0c;否则系统将可能无法正确使用索引。 10.在使用索引字段作为条件时&#xff0c;如果该索引是复合索引&#xff0c;那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引&#xff0c;
否则该索引将不会被使用&#xff0c;并且应尽可能的让字段顺序与索引顺序相一致。 11.不要写一些没有意义的查询&#xff0c;如需要生成一个空表结构&#xff1a; select col1,col2 into #t from t where 1&#61;0
这类代码不会返回任何结果集&#xff0c;但是会消耗系统资源的&#xff0c;应改成这样&#xff1a; create table #t(...) 12.很多时候用 exists 代替 in 是一个好的选择&#xff1a; select num from a where num in(select num from b)
用下面的语句替换&#xff1a; select num from a where exists(select 1 from b where num&#61;a.num) 13.并不是所有索引对查询都有效&#xff0c;SQL是根据表中数据来进行查询优化的&#xff0c;当索引列有大量数据重复时&#xff0c;SQL查询可能不会去利用索引&#xff0c;
如一表中有字段sex&#xff0c;male、female几乎各一半&#xff0c;那么即使在sex上建了索引也对查询效率起不了作用。 14.索引并不是越多越好&#xff0c;索引固然可以提高相应的 select 的效率&#xff0c;但同时也降低了 insert 及 update 的效率&#xff0c;
因为 insert 或 update 时有可能会重建索引&#xff0c;所以怎样建索引需要慎重考虑&#xff0c;视具体情况而定。
一个表的索引数最好不要超过6个&#xff0c;若太多则应考虑一些不常使用到的列上建的索引是否有必要。 15.尽量使用数字型字段&#xff0c;若只含数值信息的字段尽量不要设计为字符型&#xff0c;这会降低查询和连接的性能&#xff0c;并会增加存储开销。
这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符&#xff0c;而对于数字型而言只需要比较一次就够了。 16.尽可能的使用 varchar 代替 char &#xff0c;因为首先变长字段存储空间小&#xff0c;可以节省存储空间&#xff0c;
其次对于查询来说&#xff0c;在一个相对较小的字段内搜索效率显然要高些。 17.任何地方都不要使用 select * from t &#xff0c;用具体的字段列表代替“*”&#xff0c;不要返回用不到的任何字段。 18.避免频繁创建和删除临时表&#xff0c;以减少系统表资源的消耗。

19.临时表并不是不可使用&#xff0c;适当地使用它们可以使某些例程更有效&#xff0c;例如&#xff0c;当需要重复引用大型表或常用表中的某个数据集时。但是&#xff0c;对于一次性事件&#xff0c;最好使用导出表。 20.在新建临时表时&#xff0c;如果一次性插入数据量很大&#xff0c;那么可以使用 select into 代替 create table&#xff0c;避免造成大量 log &#xff0c;
以提高速度&#xff1b;如果数据量不大&#xff0c;为了缓和系统表的资源&#xff0c;应先create table&#xff0c;然后insert。

21.如果使用到了临时表&#xff0c;在存储过程的最后务必将所有的临时表显式删除&#xff0c;先 truncate table &#xff0c;然后 drop table &#xff0c;这样可以避免系统表的较长时间锁定。 22.尽量避免使用游标&#xff0c;因为游标的效率较差&#xff0c;如果游标操作的数据超过1万行&#xff0c;那么就应该考虑改写。 23.使用基于游标的方法或临时表方法之前&#xff0c;应先寻找基于集的解决方案来解决问题&#xff0c;基于集的方法通常更有效。

24.与临时表一样&#xff0c;游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法&#xff0c;尤其是在必须引用几个表才能获得所需的数据时。

在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许&#xff0c;基于游标的方法和基于集的方法都可以尝试一下&#xff0c;看哪一种方法的效果更好。

25.尽量避免大事务操作&#xff0c;提高系统并发能力。

26.尽量避免向客户端返回大数据量&#xff0c;若数据量过大&#xff0c;应该考虑相应需求是否合理。

3、索引优化 

1&#xff09;、 创建索引&#xff0c;

  以下情况不适合建立索引

  • 表记录太少
  •  经常插入、删除、修改的表
  •  数据重复且分布平均的表字段

2&#xff09;、 复合索引

  如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引

索引

  索引是对数据库表中一列或多列的值进行排序的一种结构。  

优点&#xff1a;

l 大大加快数据的检索速度

l 创建唯一性索引&#xff0c;保证数据库表中每一行数据的唯一性

l 可以加速表和表之间的连接

缺点&#xff1a;

l 索引需要占物理空间。

l 当对表中的数据进行增加、删除和修改的时候&#xff0c;索引也要动态的维护&#xff0c;

降低了数据的维护速度

索引分类&#xff1a;

l 普通索引

create index zjj_temp_index_1 on zjj_temp_1(first_name);

drop index zjj_temp_index_1;

l 唯一索引&#xff0c;索引列的值必须唯一&#xff0c;但允许有空值

create unique index zjj_temp_1  on zjj_temp_1(id);

l 主键索引&#xff0c;它是一种特殊的唯一索引&#xff0c;不允许有空值。

  l 组合索引

 

参考博客&#xff1a;https://www.jianshu.com/p/5052f6a454ef

     http://blog.csdn.net/jie_liang/article/details/77340905 

      https://www.cnblogs.com/wmbg/p/6800354.html

 

 


转载于:https://www.cnblogs.com/huststl/p/8280412.html


推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
author-avatar
喵喵浮游生物
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有