`
dwj147258
  • 浏览: 194094 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

索引的选择原则

阅读更多

1、 表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就等于该表的行数。MySQL在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时,MySQL自动创建主索引(primary index),且索引名称为Primary;数据库用户创建唯一性索引时,MySQL自动创建唯一性索引(unique index),默认情况下,索引名为唯一性索引的字段名。 
2、 占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。 
3、 存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字。 
4、 Where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。 
5、 更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。 
6、 最左前缀原则。 
7、 尽量使用前缀索引。 
引入索引的目的就是提高数据的检查效率,因此索引关键字的选择与select语句息息相关。这句话有两个含义:一是,select语句的设计可以决定索引的设计;索引的设计也同样影响着select语句的设计。例如原则1与原则2,可以影响select语句的设计;而select语句中的where子句、group by子句以及,又可以影响索引的设计。两个表的连接字段应该创建索引,外键约束一经创建,MySQL会自动地创建与外键相对应的索引,这是由于外键字段通常是两个表的连接字段。 
复合索引还有一个优点,它通过被称为“最左前缀”(leftmost prefixing)的概念体现出来的。假设向一个表的多个字段(例如fristname、lastname、address)创建复合索引(索引名为fname_lname_address).当where查询条件是以下各种字段的组合是,MySQL将使用fname_lname_address索引。其他情况将无法使用fname_lname_address索引。可以理解:一个复合索引(firstname、lastname、address)等效于(firstname,llastname,age)、(firstname,lastname)以及(firstname)三个索引。基于最做前缀原则,应尽量避免创建重复的索引,例如,创建了fname_lname_address索引后,就无需再first_name子段上单独创建一个索引。

如果数据库表的存储引擎是MyISAM,那么创建主键的约束的同时,MySQL会自动创建主键索引。如果数据库表的存储引擎是InnoDB,那么创建主键约束的同时,MySQL会自动创建聚簇索引。 
MySQL还支持全文索引(fulltext),当查询数据量大的字符串信息时,使用全文索引可以大幅提升字符串的检索效率。需要注意的是,全文索引只能创建在char、varchar或者text字符串类型的字段上,且全文索引不支持前缀索引。

 

1. 索引建立的原则

用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。

仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是很好的备选列

SELECT
col_a <- 不是备选列
FROM
tbl1 LEFT JOIN tbl2
ON tbl1.col_b = tbl2.col_c <- 备选列
WHERE
col_d = expr; <- 备选列

当然,显示的数据列与WHERE子句中使用的数据列也可能相同。
我们的观点是输出列表中的数据列本质上不是用于索引的很好的备选列。


2. 复合索引的建立以及最左前缀原则

索引字符串值的前缀(prefixe)。如果你需要索引一个字符串数据列,那么最好在任何适当的情况下都应该指定前缀长度。
例如,如果有CHAR(200)数据列,如果前面10个或20个字符都不同,就不要索引整个数据列。
索引前面10个或20个字符会节省大量的空间
你可以索引CHAR、VARCHAR、BINARY、VARBINARY、BLOB和TEXT数据列的前缀。


假设你在表的state、city和zip数据列上建立了复合索引。索引中的数据行按照state/city/zip次序排列,
因此它们也会自动地按照state/city和state次序排列。这意味着,即使你在查询中只指定了state值,
或者指定state和city值,MySQL也可以使用这个索引。因此,这个索引可以被用于搜索如下所示的数据列组合:
state, city, zip
state, city
state

MySQL不能利用这个索引来搜索没有包含在最左前缀的内容。例如,如果你按照city或zip来搜索,
就不会使用到这个索引。如果你搜索给定的state和具体的ZIP代码(索引的1和3列),
该索引也是不能用于这种组合值的,尽管MySQL可以利用索引来查找匹配的state从而缩小搜索的范围。

如果你考虑给已经索引过的表添加索引,那么就要考虑你将增加的索引是否是已有的多列索引的最左前缀。
如果是这样的,不用增加索引,因为已经有了(例如,如果你在state、city和zip上建立了索引,那么没有必要再增加state的索引)。

3. 实例分析

通过实例理解单列索引、多列索引以及最左前缀原则
实例:现在我们想查出满足以下条件的用户id:
mysql>SELECT `uid` FROM people WHERE lname`='Liu'  AND `fname`='Zhiqun' AND `age`=26
因为我们不想扫描整表,故考虑用索引。

单列索引:
ALTER TABLE people ADD INDEX lname (lname);
将lname列建索引,这样就把范围限制在lname='Liu'的结果集1上,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。

由于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。

多列索引:
ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);
为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。

注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。


3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。

分享到:
评论

相关推荐

    数据库索引设计原则.

    1.1 基本原则:索引设计应遵守基本原则,即索引列的选择、索引类型的选择、索引的维护等。 1.2 主关键字的约束:主关键字是数据库表中的唯一标识符,索引设计应遵守主关键字的约束,确保数据的一致性和唯一性。 ...

    SQLServer索引设计经验谈

    ##### 1.2 索引选择原则 - **考虑列的选择性**:如果某列的选择性较高(即具有较高的唯一性),则适合建立聚集索引。 - **查询模式**:如果查询经常涉及到多列组合,则可以考虑创建覆盖索引或复合索引。 - **数据...

    oracle数据库索引与sql的优化

    #### 二、索引的选择与使用原则 1. **索引选择原则:** - 当查询涉及的数据行小于表数据总量的5%时,使用索引查询效果较好。 - 如果WHERE子句中涉及到的列是经常排序或分组的列,则建立索引有助于加速查询过程。 ...

    mysql高性能索引查询(查询性能问题、索引使用原则、索引创建、索引的优点缺点).docx

    这里涉及到了“最左前缀原则”,即在使用组合索引时,查询条件必须与索引定义的字段顺序一致,并且至少包含索引的第一个字段。例如,上述索引支持如下查询: ```sql SELECT * FROM ds_order WHERE create_time = '...

    Oracle 创建索引的基本规则

    ### Oracle 创建索引的基本规则 在Oracle数据库管理中,创建合适的索引对于提高查询效率、减少数据...通过遵循上述基本原则,可以根据具体的应用场景灵活选择和调整索引策略,从而实现最佳的查询性能和资源利用率。

    数据库 创建索引 sql oracle

    索引的优化包括选择正确的索引类型、选择正确的索引字段、优化索引的填充因子、优化索引的 Statistics 等。 创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。但是,索引的创建和管理需要遵循一定的...

    索引的使用原则.pdf

    索引的使用原则是数据库性能优化的关键,以下将详细阐述索引使用的关键知识点。 首先,索引可以极大地加速SELECT查询,尤其是当表的数据量大且经常用于查询条件的列上建立了索引时。例如,在上述提供的片段中,查询...

    第08章_索引的创建与设计原则.pdf

    MySQL 索引的创建与设计原则 索引是 MySQL 中一个非常重要的概念,它可以大幅度地提高查询速度和效率。在本章节中,我们将详细介绍索引的分类、创建、设计原则和优化方法。 1. 索引的分类 MySQL 的索引包括普通...

    MySQL 高级 笔记

    **1.2 索引选择原则** - **最左前缀原则**:当查询从索引的最左前列开始,并且不跳过索引中的列时,可以使用索引。 - **索引下推**:在5.6版本后引入的新特性,可以在索引遍历过程中,对索引包含的字段先做判断,...

    数据库索引设计和优化

    在这个主题中,我们将深入探讨数据库索引的基础概念、设计原则、优化策略以及实际应用。 一、索引基础知识 索引是数据库系统为了加速查询而创建的数据结构,类似于书籍的目录,它提供了快速访问特定数据记录的途径...

    oracle官方mysql性能调优优化文档

    - **索引选择原则**:MySQL会根据统计信息选择最合适的索引,以减少I/O操作。 #### 五、连接优化器(Join Optimizer) ##### 1. 连接类型 MySQL支持内连接、左连接等多种类型的连接操作。连接操作通常是复杂查询中最...

    SQLSEVER索引和索引调整向导

    一般来说,选择创建索引的列时,可以参考以下的原则: * 在经常需要搜索的列上创建索引,加快搜索的速度。 * 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。 * 在经常用于连接的列上创建...

    索引优化原则及Oracle中索引总结

    Oracle索引建立原则  · 确定针对该表的操作是大量的查询操作还是大量的增删改操作。  · 尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。  · where语句中...

    mysql-实用-索引失效和优化原则

    mysql-实用-索引失效和优化原则

    SQL语句索引优化_sql索引降龙十八掌(Oracle)

    本文将深入探讨Oracle数据库中的索引优化原则和方法,这些原则和方法同样适用于其他数据库系统。让我们一起领略"SQL索引降龙十八掌"的精髓。 一、了解索引 1. 索引类型: - B树索引:最常见的索引类型,适用于等值...

    Teradata从入门到精通2

    - **索引选择原则**:提供了选择合适索引类型的指导原则,以确保查询性能。 - **数据库设计组件**:概述了构成数据库设计的主要组成部分,如表、视图、存储过程等。 #### 数据分布、哈希与索引访问 模块2聚焦于...

    mysql存储与索引技术

    在索引优化方面,最左前缀原则是一个关键概念,这意味着复合索引只能按照索引创建时列的顺序部分使用,例如,INDEX(A, B, C)可以用于 WHERE A = x 或 WHERE A = x AND B = y 的查询,但不能单独用于 WHERE B = y 或 ...

    Mysql数据库优化

    - **7.2 索引选择原则** - **避免冗余**: 同一个表上不要建立多个功能相同的索引。 - **考虑索引覆盖**: 使用索引覆盖查询,减少数据访问。 #### 八、SQL语句优化 - **8.1 使用EXPLAIN分析** - **目的**: 分析...

    数据库索引设计与优化

    三、索引设计原则 1. 针对频繁查询的列创建索引:根据SQL语句的执行计划,找出最常用于查询的列来建立索引。 2. 平衡读写性能:在考虑索引数量时,需要平衡读取速度和写入速度,避免过度索引。 3. 复合索引:对于多...

Global site tag (gtag.js) - Google Analytics