1. MySQL 中有哪几种锁?
    • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
    1. 在 MySQL 数据库中 MyISAM 和 InnoDB 的区别
    • MyISAM:
      • 不支持事务,但是每次查询都是原子的;
      • 支持表级锁,即每次操作是对整个表加锁;
      • 存储表的总行数;
      • 一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件;采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。
    • InnoDb:
      • 支持 ACID 的事务,支持事务的四种隔离级别;
      • 支持行级锁及外键约束:因此可以支持写并发;
      • 不存储总行数:
      • 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持 B+树结构,文件的大调整。
    1. MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
    • read uncommited :读到未提交数据
    • read committed:脏读,不可重复读
    • repeatable read:可重读
    • serializable :串行事物
    1. 如何优化mysql数据库
    • 设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。
    • 选择合适的表字段数据类型和存储引擎,适当的添加索引。
    • MySQL 库主从读写分离。
    • 找规律分表,减少单表中的数据量提高查询速度。
    • 添加缓存机制,比如 memcached,apc 等。
    • 不经常改动的页面,生成静态页面。
    • 书写高效率的 SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1,field_2, field_3 FROM TABLE.
    1. 锁的优化策略
    • 读写分离
    • 分段加锁
    • 减少锁持有的时间
    • 多个线程尽量以相同的顺序去获取资源
    • 不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。
    1. 什么情况下设置了索引但无法使用
    • 以“%”开头的 LIKE 语句,模糊匹配
    • OR 语句前后没有同时使用索引
    • 数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型)
    1. 实践优化MySQL
    • SQL 语句及索引的优化
    • 数据库表结构的优化
    • 系统配置的优化
    • 硬件的优化
    1. 优化数据库的方法
    • 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置 NOTNULL,例如’省份’、’性别’最好适用 ENUM
    • 使用连接(JOIN)来代替子查询
    • 适用联合(UNION)来代替手动创建的临时表
    • 事务处理
    • 锁定表、优化事务处理
    • 适用外键,优化锁定表
    • 建立索引
    • 优化查询语句
    1. 数据库中的事务是什么?
    • 事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
    • 事务特性:
      • 原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。
      • 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
      • 隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务
      • 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
    1. 为表中得字段选择合适得数据类型
    • 字段类型优先级: 整形>date,time>enum,char>varchar>blob,text
    • 优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型,同级别得数据类型,应该优先选择占用空间小的数据类型
    1. 关系型数据库中索引概念。
    • 目的: 快速访问数据表中的特定信息,提高检索速度 创建唯一性索引,保证数据库表中每一行数据的唯一性。 加速表和表之间的连接
    • 负面影响: 创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需 要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间; 当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维1护速 度。
    • 建立索引原则: 在最频繁使用的、用以缩小查询范围的字段上建立索引。 在频繁使用的、需要排序的字段上建立索引。
    • 不适合建立索引: 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
    1. SQL语句优化方法
    • Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可 以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。
    • 用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。
    • 避免在索引列上使用计算
    • 避免在索引列上使用 IS NULL 和 IS NOT NULL
    • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 及的列上建立索引。
    • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃 使用索引而进行全表扫描
    • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用 索引而进行全表扫描