zoukankan      html  css  js  c++  java
  • 数据库部分--面试题

    一、mysql数据库常见数据类型

    数值型、日期/时间、字符串。

    数值型:int、smallint、tinyint、mediumint、bigint  ;浮点型:float、double、decimal(两数比较,大的+2)

    日期/时间:date(YYYY-MM-DD)、time(HH:MM:SS)、year、datetime、timestamp(随其他字段修改自动刷新时间)

    字符串:char(定长)、varchar(变长)、tinyblob、tinytext、blob(二进制长文本)、text(长文本)、medlumblob、medlumtext、longblob、longtext

    二、事务

    1.作用:

    用于处理操作量大,复杂度高的数据。

    2.事务的特性:

    原子性:即不可分割性,一个事务的所有操作要么都完成,要么都完不成,执行过程中发生错误回滚到事务开始前的状态。

    一致性:数据的修改符合预设规则,数据间的联系规则正常自发性地完成,如B给A转账100,A的金额+100,B的金额就必须-100。

    隔离性:多个并发事务不能同时对同一行数据进行修改。事务隔离级别:未提交、读提交、可重复读、串行化。

    持久性:事务对数据的修改是永久的。

    3.如何开启事务

    begin 或 start

    4.索引优缺点

    优点:大大提高了查询速度。缺点:占用磁盘空间,降低表的更新速度。

    5.创建索引语法

    create index [tablename] on [tablename]([indexfield]);

    6.如何防止出现重复数据

    使用 PRIMARY  KEY 主键或者 UNIQUE 唯一索引来保证数据的唯一性。insert ignore into在插入数据时,数据库中已存在的数据会忽略。

    7.过滤重复数据

    需要读取不重复数据可以使用 DISTINCT 或者 GROUP  BY。

    8.删除重复数据

    第一种方法:将原表数据通过 GROUP  BY 查询出来并复制到临时表中,删除原表,将临时表改名。

    第二种方法:修改表结构,添加唯一索引或主键。

    9.sql注入5种漏洞

    数据库联合查询注入攻击、数据库报错查询注入攻击、字符型数据库注入攻击、数据库盲注sql注入攻击、字符型注入攻击。

    10.防止sql注入方法

    pymysql中使用args传递参数,pymysql会对参数进行自动转义。

    限制特殊字符的输入,如单引号,逗号,*,反斜杠,写入过滤代码过滤带有AND 1=1、select、union等的数据。

    开启网站防火墙,IIS防火墙,apache防火墙,nginx防火墙都有内置过滤sql注入的参数。

    11.mysql导出数据及备份

    导出:SELECT * FROM table INTO OUTFILE '/tmp/runoob.txt'

    备份:mysqldump -u root -p --all-databases > database_dump.txt

    12.mysql导入数据

    mysql -u root -p 密码 < runoob.sql

    source /home/abc/abc.sql  (要进入数据库)

    mysqlimport -u root -p --local database_name dump.txt

    13.数据库常见函数

    replace, reverse, strcmp, upper, abs, avg, count, floor, max, min, sum, current_date, localtimestamp, now, cast(x as type)转换数据类型如字符串日期转日期

    14.触发器、存储过程、视图

    触发器:满足触发条件时,系统自动执行触发器的触发体,可调用多个存储过程。触发时间:before, after,触发事件:insert, update, delete,触发类型:行触发,语句触发。

    存储过程:编译好的sql语句集合。优点:运行速度快,保证数据安全性和完整性,减少网络流量,重复性;缺点:调试麻烦,维护麻烦,不易移植,存在重新编译问题。

    视图:select返回结果组成的虚拟表,类似存储过程,但存储过程范围更广,可以传参数。

    15.内存溢出和内存泄漏

    内存溢出:指程序在申请内存时,没有足够的内存空间供其使用。

    内存泄漏:指程序在申请内存后,无法释放已申请的内存空间。

    16.查看、更改表结构命令

    查看:desc  table_name;

    更改:alter  table  [table_name]  drop/add/modify/change  [字段]

    17.mysql常见数据库引擎及区别

    常见引擎有InnoDB、MyISAM、MEMORY(HEAP)、BLACKHOLE

    MyISAM:高速存储和检索,有全文搜索能力,不支持事务,只有表级锁,没有行级锁,不支持外键。

    InnoDB:支持事务、外键、行级锁、并发控制,提供了事务安全,但其写入数据速度慢,占用磁盘空间大。

    MEMORY:放在内存中的表,关机或重启,数据消失。

    BLACKHOLE:写入的任何数据都会消失,用于记录二进制sql语句用于主从复制中的中继存储。

    18.mysql索引种类

    普通索引,唯一索引,主键索引,组合索引,全文索引

    19.索引合并、覆盖索引、分库分表、聚集索引、辅助索引、读写分离

    索引合并:指使用多个索引查询,然后合并结果。

    覆盖索引:所查询数据的列只需从索引中就能得到,不必读取数据行。

    分库分表:垂直切分指依据不同的表分给不同的数据库,水平切分指依据表中数据的逻辑关系,将同一个表数据拆分到多个表中。

    聚集索引:索引表的树的叶子节点存放整行数据,每个叶子节点通过双向链表连接。

    辅助索引:叶子节点只包含索引列的值和主键id,不需双向链表。

    读写分离:让主数据库处理事务性增(insert)、删(delete)、改(update),从数据库处理查询(select)操作。

    20.创建索引但无法命中索引的情况

    • 使用通配符%和_开头的模糊查询
    • 条件中有or,条件字段不全是索引字段
    • 组合索引没有用到索引的第一个字段(没有遵循最左前缀规则)
    • 查询列类型是字符串,但没用引号引起来
    • 查询范围较大
    • 使用反向条件,如not、!、<>

    21.数据库优化方案

    • 尽量使用char代替varchar,尽量不使用*,尽量不使用游标
    • 使用join代替子查询
    • 使用联合(union)代替手动创建临时表
    • 创建索引
    • 尽量避免进行null值判断
    • update语句,更改少量字段不要update全部字段
    • 分库分表
    • 读写分离
    • 调整数据库引擎
    • 优化查询语句

    22.mysql慢日志

    记录运行时间超过预设值的日志。

  • 相关阅读:
    Python基础教程:多线程运行带多个参数的函数
    Python基础教程:list相关操作
    python字典教程:setdefault方法和get方法
    Python 异常处理集合
    python基础教程:5个带key的python内置函数
    python操作Excel的5种方式
    Python3压缩和解压缩实现
    jenkins 分布式配置主从节点
    CentOS7 free字段含义
    nginx配置https
  • 原文地址:https://www.cnblogs.com/heshike/p/10574068.html
Copyright © 2011-2022 走看看