mysql 索引优化的要点(系列一)

背景:sql 优化对数据来说是什么非常重要,sql的索引优化更重中之重,有的人认为索引优化就是简单加一个索引,其实这种想法是错的,索引是涉及到很多知识点,并非大家想得这么简单,废话不多说,马上开车!

一,头盘:

SQL语句的五大要素:
1,获得结果集所需访问的查询条件
2,定义结果集所需的查询条件
3,结果集的大小
4,获得结果集所涉及的表的数量
5,多少用户同时修改这些数据

二,主菜:索引的一些特性和优化建议

1,经常变的索引列放在最后,这样会降低变更成本
2,索引字段的顺序非常重要,如果排序前有范围查询就不能使用索引排序,如:
索引A(a,b.c)
select a,b,c from t where a=1 and b between d1 and d2 order by c;
这样就需要排序
索引B(a,c,b)
就不用排序

--备注:
一般来说会优先选择B不需要排序,因为一般来说一个事务每次查询的结果集都是很小的,会限定输出的结果集,这个时候不用排序就会很快,选择索引A时结果集要排序,如果结果集(满足条件的结果)很大的话,这样是会很慢的

3,当以下三个条件同时满足,过虑因子隐患可以会产生:
1),访问路径中没有排序
2),第一屏幕结果一建立就回应
3),不是所有的谓词字段都参与定义待扫描的索引片

4,使用短索引。如果对多列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。
例如,如果有一个CHAR(200) 列,如果在前10 个或20 个字符内,多数值是惟一的,
那么就不要对整个列进行索引。对前10 个或20 个字符进行索引能够节省大量索引空
间,也可能会使查询更快。较小的索引涉及的磁盘I/O 较少,较短的值比较起来更快。
更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL
也可以在内存中容纳更多的值。这增加了找到行而不用读取索引中较多块的可能性。
(当然,应该利用一些常识。如仅用列值的第一个字符进行索引是不可能有多大好处的,因为这个索引中不会有许多不同的值)

5,物化结果集:是指执行必要的数据库访问来构建结果集(比如排序)
1)为了避免不必要的工作,数据库系统总是尽可能晚地去进行物化结果,如果数据库系统先物化结果集,那么在FETCH调用的时候,系统将从临时表中检索记录,而在数据更新的时候,并不会更新临时表中存放的结果集
2)一次FETCH调用物化一条记录
如果满足的条件:
(1)没有排序需求
(2)存在一个可以满足结果集的索引
3)提前物化
(1)一般来说有排序都要提前物化,结果集排序,就是只需要提取一条记录,也必须物化整个结果集

6,过滤因子隐患
过滤因子:被用来定义谓词的选择性:满足谓词条件的记录数占表行总数的比例,该值取决于列值的分布情况,当评估一个索引是否合适时,最差的情况的过滤因子比平时的过滤因子更重要

半宽索引:一个包含where子句中所有列是的索引,使用半宽索引时,只有检索到匹配条件时才会访问表,而这个访问是随机读
宽索引:一个包含了select 语句中所涉及的所有字段的索引,包括投影的字段和where子句中的字段,使用这种索引时,不需要读表
结论:宽索引的优势在于避免了返回的结果集的回表随时读

三,下车收工
下次和大家分享三星索引

原文地址:http://blog.51cto.com/538858/2328536

时间: 2024-08-28 17:36:38

mysql 索引优化的要点(系列一)的相关文章

mysql索引优化

mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间,处理起来更快. >简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂.在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间:以及用整型数据类型存储IP地址. >尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL.在MySQL中,含有空

MySQL索引优化-from 高性能MYSQL

Btree: 1. 尽量使用覆盖索引, 即三星索引 2. 多列索引如果带范围的话, 后续列不会作为筛选条件 3. 多列索引应选择过滤性更好的充当前缀索引 4. 尽量按主键顺序插入, 减少页分裂, 采用自增ID在高并发情况下, 可能造成明显征用, 或者更改innodb_autoinc_lock_mode配置. Hash: 1.只有精确匹配所有列的查询才有效, 对于每行数据, 引擎都会对所有索引列计算hash码 2. 只有memory才可以支持hash索引, innodb支持自适应hash索引, 但

【转载】MySQL索引优化

MySQL索引优化 原文链接 MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构.索引是在存储引擎中实现的,所以每种存储引擎中的索引都不一样.如MYISAM和InnoDB存储引擎只支持BTree索引:MEMORY和HEAP储存引擎可以支持HASH和BTREE索引. 这里仅针对常用的InnoDB存储引擎所支持的BTree索引进行介绍: 一.索引类型 先创建一个新表,用于演示索引类型 CREATE TABLE index_table ( id BIGINT NOT NULL au

Mysql 索引优化分析

MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义.助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句.还在等啥子?撸起袖子就是干! 案例分析 我们先简单了解一下非关系型数据库和关系型数据库的区别. MongoDB是NoSQL中的一种.NoSQL的全称是Not only SQL,非关系型数据库.它的特点是性能高,扩张性强,模式灵

mySql索引优化分析

MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义.助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句.还在等啥子?撸起袖子就是干! 案例分析 我们先简单了解一下非关系型数据库和关系型数据库的区别.MongoDB是NoSQL中的一种.NoSQL的全称是Not only SQL,非关系型数据库.它的特点是性能高,扩张性强,模式灵活

MySQL索引优化步骤总结

在项目使用mysql过程中,随着系统的运行,发现一些慢查询,在这里总结一下mysql索引优化步骤 1.开发过程优化 开发过程中对业务表中查询sql分析sql执行计划(尤其是业务流水表),主要是查看sql执行计划,对sql进行优化. explain执行计划关键属性 select_type,possible_keys,key,rows (1) select_type 访问类型 system>const > eq_ref > ref > fulltext > ref_or_null

MySQL 索引优化原则

一.索引优化原则 1.最左前缀匹配原则,联合索引,mysql会从做向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整. 2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优

Mysql 索引优化

索引的存储分类MyISAM 存储引擎的表数据和索引是自动分开存储的,各自是独一的一个文件Innodb 存储引擎的表数据和索引是存储在同一个表空间里面,但可以由多个文件构成.Mysql 目前不支持函数索引,但是能对列的前面某一部分进行索引例如 name 字段,可以只取 name 的前 4 个字符进行索引,可降低索引文件大小.Mysql> create index ind_company_name on company(name(4));说明:ind_company_name 索引名,company

mysql索引优化面试题

曾经偷偷的面试了两个单位,都提到了Mysql的优化问题,所以以后要多多学习数据库的优化知识了.建设数据库的优化大概主要就是索引的优化了吧,因为我们不可能修改数据结构的情况下,提高数据库的查询效率似乎也只能用索引了.当然这也是建立在你sql语句写的比较科学的情况下,如果你的sql语句本身就写的比较垃圾,神仙也救不了你!下边是在网上找到的一些资料,保留下来备用吧1,创建索引对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索