- 索引
- 索引的目的
- 快速访问数据信息 (索引文件提高检索速度)
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
- 索引对数据库系统的负面影响
- 创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加
- 索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间
- 当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度
- 建立索引的原则
- 在最频繁使用的、用以缩小查询范围的字段上建立索引
- 在频繁使用的、需要排序的字段上建立索引
- InnoDB建议使用默认自增的int型主键作为主索引
- 不宜建立索引
- 对于查询中很少涉及的列或者重复值比较多的列
- 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
- 设置了索引无法使用
- 以“%”开头的LIKE语句,模糊匹配
- OR语句前后没有同时使用索引
- 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
- 查询
整理中
- 其它
- 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.
2.锁的优化策略
- 读写分离
- 分段加锁
- 减少锁持有的时间
- 多个线程尽量以相同的顺序去获取资源
不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。
- 索引的底层实现原理和优化
B+树,经过优化的B+树
主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的int主键作为主索引。
- 实践中如何优化MySQL
最好是按照以下顺序优化:
1.SQL语句及索引的优化
- 数据库表结构的优化
3.系统配置的优化
4.硬件的优化
- 优化数据库的方法
- 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如:’省份’、’性别’最好适用ENUM
- 使用连接(JOIN)来代替子查询
- 适用联合(UNION)来代替手动创建的临时表
- 事务处理
- 锁定表、优化事务处理
- 适用外键,优化锁定表
- 建立索引
- 优化查询语句