文章目录
MySQL数据库,一天五万条以上的增量,预计运维三年怎么优化?
MySQL 如何获取表内所有 Field 对象的名称和类型?
假设你有一个名为 ‘xyz’ 的表,它存在多个字段,如 ‘createtime’和 ‘engine’
请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?重点
如果insert等dml语句的性能有问题的话,或者其他问题的存在,可能造成同步延迟,所以如何有效避免同步延迟的出现?重点
Innodb是行锁,那什么时候会产生行锁,什么情况下会变成表锁?
MYSQL 如果发现CPU,或者IO压力很大,怎么定位问题?重点
SQL 编程中 drop, delete truncate的区别?重点
描述MySQL中,索引,主键,唯一索引,联合索引的区别?重点
mysql_fetch_row()和mysql_fetch_array()的区别 ?
MySQL 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称?
使用非运算符(!)从表”Tecmint”中列出除了”SAM”以外的所有user记录?
如果你只想知道从一个结果集的开头或者结尾开始的特定几条记录,该如何实现?
MySQL_pconnect是什么? MySQL_connect有什么区别?
前言
本文主要介绍数据库相关面试或者笔试会问到的问题以及解答。
请简述数据库三大范式 ?
数据库三大范式是指关系数据库设计中的三个规范化级别,用于确保数据的结构和关系的合理性和一致性。以下是对每个范式的简要描述:
1. 第一范式(1NF):要求数据库表中的每个列都是原子的,即每个列都不可再分。这意味着每个列中的数据不能包含多个值或重复的组合值。
2. 第二范式(2NF):在满足第一范式的基础上,要求数据库表中的每个非主键列完全依赖于主键。这意味着每个非主键列的值必须与主键直接相关,而不能依赖于其他非主键列。
3. 第三范式(3NF):在满足第二范式的基础上,要求数据库表中的每个非主键列不依赖于其他非主键列。这意味着每个非主键列的值必须直接依赖于主键,而不能通过其他非主键列间接地确定。
通过遵循这三个范式,可以减少数据冗余、提高数据的一致性和完整性,同时简化数据的更新和维护操作。然而,需要根据具体的业务需求和数据特点来判断是否需要满足所有的范式要求,有时候也需要根据实际情况进行适度的冗余或优化。
简述什么是SQL Server ?
SQL Server是由Microsoft开发和销售的关系数据库管理系统或RDBMS。
与其他RDBMS软件类似,SQL Server构建于SQL之上,SQL是一种用于与关系数据库交互的标准编程语言。 SQL Server与Transact-SQL或T-SQL绑定,后者是Microsoft的SQL实现,它添加了一组专有的编程结构。
SQL Server专门在Windows环境中工作超过20年。 2016年,微软首次推出了Linux版本的SQL Server。 SQL Server 2017于2016年10月普遍发布,可在Windows和Linux上运行。
MySQL 如何优化SQL查询语句?重点
1:避免全表扫描
考虑在 where 和 order by 涉及的列上建立索引,in 和 not in 也要慎用,尽量用 between 取代。
2:优化 COUNT 查询
count 可以统计列的数量,统计列值时要求列非空;COUNT 还可以统计行数,当 MySQL 确定括号内的表达式不可能为 NULL 时,实际上就是在统计行数。当使用 COUNT(*) 时,会忽略所有列而直接统计行数。
某些业务场景不要求完全精确的 COUNT 值,此时可以使用近似值来代替,EXPLAIN 估算的行数就是一个不错的近似值。
3:避免子查询
在 MySQL5.5 及以下版本避免子查询,因为执行器会先执行外部的 SQL 再执行内部的 SQL,可以用关联查询代替。
4:禁止排序
当查询使用 GROUP BY 时,结果集默认会按照分组的字段进行排序,如果不关心顺序,可以使用 ORDER BY NULL 禁止排序。
5:优化分页
在偏移量非常大的时候,需要查询很多条数据再舍弃,代价非常高。最简单的优化是尽可能地使用覆盖索引扫描,而不是查询所有的列,然后做关联操作再返回所需的列。还有一种方法是从上一次取数据的位置开始扫描,避免使用 OFFSET。
6:优化 UNION
MySQL 通过创建并填充临时表的方式来执行 UNION 查询,除非确实需要消除重复的行,否则使用 UNION ALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,对整个临时表的数据做唯一性检查,代价非常高。
7:使用用户自定义变量
用户自定义变量是一个用来存储内容的临时容器,在连接 MySQL 的整个过程中都存在,可以在任何可以使用表达式的地方使用自定义变量,避免重复查询刚刚更新过的数据
简述优化MySQL数据库的方法?重点
1、选取合适的字段属性
MySQL支持大数据的储存,但是一般来说,数据库中的表越小查询速度越快,所以在建表的时候尽量将表的宽度设小,另一个就是在尽可能的情况下把字段设置为NOTNULL
2、使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始就支持SQL子查询,他可以使用SELECT语句来创建一个单列的查询结果,然后将这个结果作为过滤条件用在另一个查询中比如
SELRCT FROM ** WHERE *** NOT IN(SELECT *** FROM *)
如果使用连接(JOIN)来做查询回快很多尤其使查询字段中有索引的情况下
3、使用联合(UNION)来代替手动创建的临时表
MYSQL从4.0开始支持UNION查询,它可以把需要的使用临时表的select(两条及以上)的select查询合并到一个查询中。在客户端查询会话结束之后,临时表回会自动删除,使用UNION创建查寻时,只需要把UNION作为关键字将多个select语句连接起来(select中的字段数目要相同)
SELECT Name,Age FROM one UNION
SELECT Name,Phone FROM two UNION
SELECT Name,emile FROM three
4、事务
虽然我们可以使用子查询(Sub-Queries)、连接(JIOIN)联合(UNION)来来创建各种查寻,但并不是所有的数据库操作都是可以用一条或几条SQL语句就可以完成的,大多时候我们都需要一系列的语句来完成某种工作,当同时对两个关联表操作时可能会出现一条语句操作成功后,数据库库突然出现意外,第二个没有执行成功,这样就造成数据的不完整,甚至破坏数据中的数据,为了避免发生这种情况,我们就应该使用事务,他的作用就是,要么全成功,要么全失败,可以保证数据库的一致性和完整性
事务是以BEGIN关键字开始,以COMMIT关键字结束,在这之间的的SQL操作只要一条失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。事务还有一个重要的作用就是当多用户同时操作相同的数据源时,它可以利用锁定数据库的方法来为客户提供安全访问方式,保证用户操作不被其他用户干扰。
5、锁定表
虽然事务是维护数据库完整性的一个好方法,但是它具有独占性,有时候会影响数据库的性能所以我们可以通过使用锁定表表来实现更好的性能,使用有WRITE关键字的sql语句可以保证在UNLPCKTABLES命令执行前,不会有其他的对该表的插入,更新删除操作
LOCK TABLE one WRITE SELECT Name FROM one WHERE Age=11;
...
UPDATE one SET Name ="王五" WHERE Age=16; UNLOCKTABLES
6、使用外键
锁定表方法可以维护数据的完整性,但是不能确保数据的关联性。这时候我们可以使用外键。
CREATE TABLE customerinfo (
CustomerIDINT NOT NULL,
PRIMARYKEY ( CustomerID ) )
TYPE = INNODB;
create table salesinfo (
salesidnt not null,
customeridint not null,
primarykey ( customerid, salesid ),
foreignkey ( customerid ) references customerinfo ( customerid ) on delete cascade
) TYPE = INNODB;
注意一定要使用参数ON DELETE CASCADE保证数据的一致性,使用外键时在创建表的时候一定要将表的类型定义为事务安全表InnoDB类型。
7、使用索引
建立索引是提高数据库性能的常用方法,它可以使数据库比没有索引快的多的速度检索特定的行,尤其实在有序的情况下性能会更好。
建立索引的时候尽量建在将用于JOIN,WHERE和ORDERBY排序的字段上,尽量不要在含有大量重复的值的字段建立索引
8、优化查询语句
搜索字符型字段时减少使用LIKE关键字和通配符
尽量不要使用自动类型转换
不要在列上进行运算,
不使用NOT IN和<>操作
MySQL数据库,一天五万条以上的增量,预计运维三年怎么优化?
a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql库主从读写分离。
d. 找规律分表,减少单表中的数据量提高查询速度。
e。添加缓存机制,比如memcached,apc等。
f. 不经常改动的页面,生成静态页面。
g. 书写高效率的SQL。比如
SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.
解释为什么Oracle type4驱动被称作瘦驱动?
Oracle提供了一个type 4 JDBC驱动,被称为瘦驱动。这个驱动包含了一个oracle自己完全用Java实现的一个TCP/IP的Net8的实现,因此它是平台独立的,可以在运行时由浏览器下载,不依赖任何客户端 的oracle实现。客户端连接字符串用的是TCP/IP的地址端口,而不是数据库名的tnsname。
如何理解数据库表设计的时候字段冗余?
冗余的字段是在数据库中没有实际意义的字段,只是为了方便查询而添加的一个字段,一般出现 在多表联合查询中:例如article表有以下冗余字段
fromUserName,toUserName
如何管理这两个字段呢?通过建立一个表,表结构如下:
id,objTable,objName,sourceTable, sourceId,level,isUpdate
其中objTable=目标表 ,objName= 目标字段,sourceTable=源表,sourceId=源表ID,level=是否需要立即更新,isUpdate=是否已更新其中,level字段很有必要,有些 冗余字段并不需要在源表修改后立即更新,那么可以通过一个定期更新策略来更新。通过库表的管理,配合一个合理的存储过程,冗余字段的 使用将不再是难题。举例,如果上面两个字段发生变化,则使用触发器或者调用这个存储过程来检查是否有需要立即更新的冗余字段,需要则立即更新,不需要则isUpdate置0,等到周期性的策略来更新同时isUpdate=1。
如何查看 MySQL 是否处于运行状态?
运行命令
service mysql status
然后看输出即可
如何开启或停止 MySQL 服务?
运行命令
service mysqld start
开启服务
如何通过 Shell 登入 MySQL?
运行命令
mysql -u用户名 -p登陆密码
MySQL如何列出所有数据库?
运行命令
show databases