MySQL 的索引 和 数据库优化
2018-04-08 14:23
288 查看
1.索引问题
索引是对数据库表中,一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。MySQL有四种不同的索引类型:1>.主键索引 2>.唯一索引 3>.普通索引 4>.全文索引(MyISAM 及 MySQL5.6以上的 InnoDB)
[b]创建索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; 创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; 创建组合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名; 创建反向键索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;[/b]2.建立索引的目的是加快对表中记录的查找或排序,并非越多越好,因为创建索引是要付出代价的:
1>.增加了数据库的存储空间;2>.在插入和修改数据时,要花费较多的时间维护索引。
3.编写 SQL 时就需要注意与索引相关的规则:
1>.MySQL不支持函数转换,所以字段前面不能加函数;2>.不要在字段前面加减运算;3>.like % 在前面用不到索引;4>.不要 select *;5>.or 的查询尽量用 union 代替(Innodb);6>.order by / group by 字段包括在索引当中减少排序,效率会更高
4.数据库的优化
程序优化,尽量批量处理,避免逐条处理,减小IO数eg : insert into A (id,name) values (1,'Tom'),(2,'Bob'),(3,'Rose')减少多表连接数,尽量少的表进行连接表连接时,尽量用主键进行接连或用唯一索引表的查询多时,一定建立索引根据查询条件建立索引,如果查询条件不止一个,使用组合索引 使用合适的索引,例如时间索引,哈希索引,聚簇索引
1.in(在where语句中规定多个值)替换or2.union(合并多个select语句的结果集)替换or3.Exists(sql返回结果为真)替换distinct(返回唯一不同的值也就是去重)4.Not null 改为a>0或a>”” (检验数据是否为null比较耗费数据库性能)5.尽量多使用commit6.避免使用select *
7.A>2改为A>=38.X5400%不用前置%(进行了全表扫描)9.UNION ALL操作符替代UNION10.可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.11.用Where子句替换HAVING子句12.避免在索引列上使用计算总结:1.对查询进行优化,要尽量避免全局扫描 首先应考虑在where以及order by设计的列上建立索引2.应尽量避免在where子句中,对字段进行null值判断,否则会导致引擎放弃使用索引,而进行全表扫描3.尽量避免,在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,就会导致引擎对全表进行扫描。4.In 、not in 、like 尽量避免,都会进行全表查询。5.部分查询修改的 复杂语句尽量查分开来生成一些临时表再进行 关联操作
索引是对数据库表中,一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。MySQL有四种不同的索引类型:1>.主键索引 2>.唯一索引 3>.普通索引 4>.全文索引(MyISAM 及 MySQL5.6以上的 InnoDB)
[b]创建索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; 创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; 创建组合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名; 创建反向键索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;[/b]2.建立索引的目的是加快对表中记录的查找或排序,并非越多越好,因为创建索引是要付出代价的:
1>.增加了数据库的存储空间;2>.在插入和修改数据时,要花费较多的时间维护索引。
3.编写 SQL 时就需要注意与索引相关的规则:
1>.MySQL不支持函数转换,所以字段前面不能加函数;2>.不要在字段前面加减运算;3>.like % 在前面用不到索引;4>.不要 select *;5>.or 的查询尽量用 union 代替(Innodb);6>.order by / group by 字段包括在索引当中减少排序,效率会更高
4.数据库的优化
程序优化,尽量批量处理,避免逐条处理,减小IO数eg : insert into A (id,name) values (1,'Tom'),(2,'Bob'),(3,'Rose')减少多表连接数,尽量少的表进行连接表连接时,尽量用主键进行接连或用唯一索引表的查询多时,一定建立索引根据查询条件建立索引,如果查询条件不止一个,使用组合索引 使用合适的索引,例如时间索引,哈希索引,聚簇索引
1.in(在where语句中规定多个值)替换or2.union(合并多个select语句的结果集)替换or3.Exists(sql返回结果为真)替换distinct(返回唯一不同的值也就是去重)4.Not null 改为a>0或a>”” (检验数据是否为null比较耗费数据库性能)5.尽量多使用commit6.避免使用select *
7.A>2改为A>=38.X5400%不用前置%(进行了全表扫描)9.UNION ALL操作符替代UNION10.可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.11.用Where子句替换HAVING子句12.避免在索引列上使用计算总结:1.对查询进行优化,要尽量避免全局扫描 首先应考虑在where以及order by设计的列上建立索引2.应尽量避免在where子句中,对字段进行null值判断,否则会导致引擎放弃使用索引,而进行全表扫描3.尽量避免,在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,就会导致引擎对全表进行扫描。4.In 、not in 、like 尽量避免,都会进行全表查询。5.部分查询修改的 复杂语句尽量查分开来生成一些临时表再进行 关联操作
相关文章推荐
- MySQL 联合索引与Where子句的优化 提高数据库运行效率
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- mysql的优化(表的设计,优化步骤,四种索引,分析慢查询,使用索引的深入解析,存储引擎分析,表的分割,数据库配置)
- 数据库管理进阶,MySQL索引分析和优化
- MySQL 数据库性能优化之索引优化(这是 MySQL数据库性能优化专题 系列的第三篇文章)
- MySQL 数据库性能优化之索引优化
- Mysql性能优化----SQL语句优化、索引优化、数据库结构优化、系统配置优化、服务器硬件优化
- MySQL 数据库性能优化之(三)索引优化
- 数据库(3):MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- Mysql性能优化实战:数据库锁的介绍与索引查找原理
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- mySql---数据库索引原理及优化
- (四)2.2 mysql 数据库对象优化之--优化索引