MySQL面试题(python版本)

  1. Python操作MySQL步骤
import pymysql


# 创建连接对象
conn = pymysql.connect(host="", port=3306, user="root", password="123456", database="demo", charset="utf8")
# 建立游标
cur = conn.cursor()
# 查询SQL语句
sql = "select * from user"
# 执行语句
count = cur.execute(sql)
# 获取结果
one_ret = cur.fetchone()   # 获取一条
for ret in cur.fetchall() # 获取所有
	print(ret)

# 增删改
# 将修改提交倒数据库
conn.commit()
# 异常回滚
conn.rollback()

# 关闭游标
cur.close()
# 关闭连接
conn.close()

  1. SQL的select语句完整的执行顺序
    (1) FROM
    (2) JOIN/OUTER … ON
    (3)WHERE
    (4)GROUP BY
    (5)WITH
    (6)HAVING
    (7)SELECT
    (8)DISTINCT/ORDER BY
    每个步骤执行的时候都会产生一个虚表,该虚表被作用为下一个步骤的输入,只有最后一步生成的表才会返回给调用者

  1. MySQL数据库的存储过程
    储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结
    构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有
    用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存
    储过程通常有以下优点:
    1、存储过程能实现较快的执行速度
    2、存储过程允许标准组件是编程。
    3、存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
    4、存储过程可被作为一种安全机制来充分利用。
    5、存储过程能够减少网络流量

  1. 事务的特性
    ACID
    原子性:事务是执行的最小单元,要么执行成功,要么失败。
    一致性:几个并行的事务,执行结果必须与按某一顺序串行执行的结果相一致。
    隔离性:事务执行互不干扰。
    持久性:对于已提交的事务,系统必须保证对数据库的改变不丢失。

  1. 数据库的索引
    索引是一种排序的结构,通常是B树,一种平衡查找树,或者是hash索引,用的较少

  1. 数据库怎么优化查询效率
    设计阶段:
    存储引擎的选择:InnoDB或者MyISAM
    分库分表,主从,读写分离
    查询阶段:
    尽量避免全表扫描:避免进行null判断,使用<>或者!=,使用or连接条件的时候一个字段有索引一个没有索引,这些都会导致全表扫描
    考虑在where及order by涉及的列上设置索引
    对于大数据量表JOIN,先分页再JOIN
    update语句,如果只更改少量字段,不要update全部字段

  1. MySQL集群的优缺点
    优点:
     99.999%的高可用性
     快速的自动失效切换
     灵活的分布式体系结构,没有单点故障
     高吞吐量和低延迟
     可扩展性强,支持在线扩容
    缺点:
     存在很多限制,比如:不支持外键
     部署、管理、配置很复杂
     占用磁盘空间大、内存大
     备份和恢复不方便
     重启的时候,数据节点将数据load到内存需要很长的时间

  1. MySQL各引擎之间的区别
    主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:
    InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一
    些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;
    MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;
    InnoDB 支持外键,MyISAM 不支持;
    MyISAM 是默认引擎,InnoDB 需要指定;
    InnoDB 不支持 FULLTEXT 类型的索引;
    InnoDB 中不保存表的行数,如 selectcount()fromtable 时,InnoDB;需要扫描一遍整个表来
    计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count()语句包含
    where 条件时 MyISAM 也需要扫描整个表;
    对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字
    段一起建立联合索引;清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建
    表;
    InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’

  1. 数据库的优化
    设计阶段:
    遵守范式,分表分库,设置缓存、静态化、分布式,引擎选择,常用数据用NoSQL保存。
    部署阶段:
    主从集群,读写分离,硬件改善
    使用阶段:
    优化索引,优化查询语句,分析慢查询

  1. MySQL如何分区分表
    分表可以通过三种方式:Mysql集群、自定义规则和merge存储引擎。
    分区有四类:
    RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
    LIST 分区:类似于按RANGE 分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个
    值来进行选择。
    HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的
    这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
    KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器
    提供其自身的哈希函数。必须有一列或多列包含整数值。

  1. 如何对查询命令进行优化
    a. 应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索。
    b. 应尽量避免在 where 子句中对字段进行 null 值判断,避免使用!=或<>操作符,避免使用 or
    连接条件,或在where子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描
    c. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无
    法正确使用索引。
    d. 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为
    条件时才能保证系统使用该索引,否则该索引将不会被使用。
    e. 很多时候可考虑用 exists 代替 in。
    f. 尽量使用数字型字段。
    g. 尽可能的使用 varchar/nvarchar 代替 char/nchar。
    h. 任何地方都不要使用 select fromt ,用具体的字段列表代替“”,不要返回用不到的任何字段。
    i. 尽量使用表变量来代替临时表。
    j. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
    k. 尽量避免使用游标,因为游标的效率较差。
    l. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET
    NOCOUNT OFF。
    m. 尽量避免大事务操作,提高系统并发能力。
    n. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

  1. SQL注入是如何产生的,如何预防
    程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。产生Sql注入。下面是防止办法:
    a. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。
    b. 在PHP 配置文件中将Register_globals=off;设置为关闭状态
    c. SQL语句书写的时候尽量不要省略小引号(tab 键上面那个)和单引号
    d. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的
    e. 对于常用的方法加以封装,避免直接暴漏SQL语句
    f. 开启PHP 安全模式:Safe_mode=on;
    g. 打开magic_quotes_gpc来防止SQL注入
    h. 控制错误信息:关闭错误提示信息,将错误信息写到系统日志。
    i. 使用mysqli或pdo预处理

  1. NoSQL和关系数据库的区别
    a.SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、
    哈希表或者其他方式。
    b. 在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引
    (index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有
    比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要
    先定义表。
    c.SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。
    而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直
    接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
    d. SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。
    NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范
    化的数据存储方式存储数据。
    e. SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可以随时删
    除任何数据。
    f. SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成
    功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而NoSQL中没有事务这
    个概念,每一个数据集的操作都是原子级的。
    g. 在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是
    优于SQL的。

  1. MySQL如何实现分页
    select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。

  1. 提取数据库中倒数10条数据
    select top (10) * from table1 order by id desc

  1. 数据库的负载均衡
    负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路
    由器衔接在一起,各节点相互协作、共同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。
    1、 实现原理
    实现数据库的负载均衡技术,首先要有一个可以控制连接数据库的控制端。在这里,它截断了
    数据库和程序的直接连接,由所有的程序来访问这个中间层,然后再由中间层来访问数据库。这样,我们就可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载采取有效的均衡策略,来调整每次连接到哪个数据库。
    2、 实现多据库数据同步
    对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的,因
    为,如果数不据实时、不同步,那么用户从一台服务器读出的数据,就有别于从另一台服务器读出的数据,这是不能允许的。所以必须实现数据库的数据同步。这样,在查询的时候就可以有多个资源,实现均衡。比较常用的方法是MoebiusforSQLServer 集群,MoebiusforSQLServer集群
    采用将核心程序驻留在每个机器的数据库中的办法,这个核心程序称为Moebius for SQL Server
    中间件,主要作用是监测数据库内数据的变化并将变化的数据同步到其他数据库中。数据同步完成后客户端才会得到响应,同步过程是并发完成的,所以同步到多个数据库和同步到一个数据库的时间基本相等;另外同步的过程是在事务的环境下完成的,保证了多份数据在任何时刻数据的一致性。
    正因为Moebius 中间件宿主在数据库中的创新,让中间件不但能知道数据的变化,而且知道引起
    数据变化的SQL语句,根据SQL语句的类型智能的采取不同的数据同步的策略以保证数据同步成
    本的最小化。数据条数很少,数据内容也不大,则直接同步数据。数据条数很少,但是里面包含大数据类型,比如文本,二进制数据等,则先对数据进行压缩然后再同步,从而减少网络带宽的占用和传输所用的时间。数据条数很多,此时中间件会拿到造成数据变化的SQL语句, 然后对SQL语句进行解析,分析其执行计划和执行成本,并选择是同步数据还是同步SQL语句到其他的数据库中。此种情况应用在对表结构进行调整或者批量更改数据的时候非常有用。
    3、 优缺点
    优点:
  1. 扩展性强:当系统要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展。
  2. 可维护性:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持
    续工作。
  3. 安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。
    另外它成功地将数据库放到了内网之中,更好地保护了数据库的安全性。
  4. 易用性:对应用来说完全透明,集群暴露出来的就是一个IP
    缺点:
    a) 不能够按照Web服务器的处理能力分配负载。
    b) 负载均衡器(控制端)故障,会导致整个数据库系统瘫痪

  1. 数据库的设计
    三范式:
    第一范式:每个列都是不可再分割的
    第二范式:每个列都必须依赖主键
    第三范式:不允许出现传递依赖

  1. 存储过程和函数的区别
    相同点:存储过程和函数都是为了可重复的执行操作数据库的sql语句的集合。
    1)存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中已经编译好的sql语句,
    不需要重复使用。减少网络交互,减少网络访问流量。
    不同点:标识符不同,函数的标识符是function,存储过程是proceduce。
    1)函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)
    来实现多个参数或者返回值。
    2)存储函数使用select调用,存储过程需要使用call调用。
    3)select语句可以在存储过程中调用,但是除了select…into之外的select语句都不能在函数中使
    用。
    4)通过in out参数,过程相关函数更加灵活,可以返回多个结果。

  1. MySQL日志
    错误日志:记录启动,运行或者停止mysql时出现的问题;
    通用日志:记录建立的客户端连接和执行的语句;
    二进制日志:记录所有更改数据的语句;
    慢查询日志:记录所有执行时间超过long_query_time秒的查询或者不适用索引的查询)
    通过使用–slow_query_log[={0|1}]选项来启用慢查询日志,所有执行时间超多long_query_time的语
    句都会被记录。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值