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