`
传说の黄花菜
  • 浏览: 201565 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何使用索引优化表

阅读更多

概述:本小结讲述了索引在优化查询中的作用,包括了索引优化查询的原理,索引在各种情况的检索中的益处,也包括索引的的弊端:增加了存储的空间,使装载数据变慢。

索引是优化查询的最常用也是最有效的的方法,一个数据表,尤其是容量很大的表,建立合适的索引,会使查询的速度提高很大.

一:索引对单个表查询的影响

索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。

例如对下面这样的一个student表:

mysql>SELECT * FROM student

+------+---------+---------+---------+---------+
| id     | name      | english | chinese | history |
+------+---------+---------+---------+---------+
|     12 | Tom       |        66 |        93 |        67 |
|     56 | Paul      |        78 |        52 |        75 |
|     10 | Marry     |        54 |        89 |        74 |
|      4 | Tina      |        99 |        83 |        48 |
|     39 | William |        43 |        96 |        52 |
|     74 | Stone     |        42 |        40 |        61 |
|     86 | Smith     |        49 |        85 |        78 |
|     37 | Black     |        49 |        63 |        47 |
|     89 | White     |        94 |        31 |        52 |
+------+---------+---------+---------+---------+

这样,我们试图对它进行一个特定查询时,就不得不做一个全表的扫描,速度很慢。例如,我们查找出所有english成绩不及格的学生:

mysql>SELECT name,english FROM student WHERE english<60;

+---------+---------+

| name    | english |

+---------+---------+

| Marry   |      54 |

| William |      43 |

| Stone   |      42 |

| Smith   |      49 |

| Black   |      49 |

+---------+---------+

其中,WHERE从句不得不匹配每个记录,以检查是否符合条件。对于这个较小的表也许感觉不到太多的影响。但是对于一个较大的表,例如一个非常大的学校,我们可能需要存储成千上万的记录,这样一个检索的所花的时间是十分可观的。

如果,我们为english列创建一个索引:

mysql>ALTER TABLE student ADD INDEX (english) ;

+-------------------+
| index for english |
+-------------------+
|                  42 |
|                  43 |
|                  49 |
|                  49 |
|                  54 |
|                  66 |
|                  78 |
|                  94 |
|                  99 |
+-------------------+
如上表,此索引存储在索引文件中,包含表中每行的english列值,但此索引是在 english的基础上排序的。现在,不需要逐行搜索全表查找匹配的条款,而是可以利用索引进行查找。假如我们要查找分数小于60的所有行,那么可以扫描索引,结果得出5

行。然后到达分数为66的行,及Tom的记录,这是一个比我们正在查找的要大的值。索引值是排序的,因此在读到包含Tom的记录时,我们知道不会再有匹配的记录,可以退出了。如果查找一个值,它在索引表中某个中间点以前不会出现,那么也有找到其第一个匹配索引项的定位算法,而不用进行表的顺序扫描(如二分查找法)。这样,可以快速定位到第一个匹配的值,以节省大量搜索时间。数据库利用了各种各样的快速定位索引值的技术,这些技术是什么并不重要,重要的是它们工作正常,索引技术是个好东西。

因此在执行下述查询

mysql>SELECT name,english FROM user WHERE english<60;

其结果为:

+---------+---------+
| name      | english |
+---------+---------+
| Stone     |        42 |
| William |        43 |
| Smith     |        49 |
| Black     |        49 |
| Marry     |        54 |
+---------+---------+

你应该可以发现,这个结果与未索引english列之前的不同,它是排序的,原因正式如上所述。

二:索引对多个表查询的影响

假如有三个未索引的表 t1t2t3,分别只包含列 c1c2c3,每个表分别由含有数值 1 1000 1000 行组成。查找对应值相等的表行组合的查询如下所示:

此查询的结果应该为 1000 行,每个组合包含 3 个相等的值。如果我们在无索引的情况下处理此查询,则不可能知道哪些行包含那些值。因此,必须寻找出所有组合以便得出与 WHERE 子句相配的那些组合。可能的组合数目为 1000×1000×1000(十亿),比匹配数目多一百万倍。很多工作都浪费了,并且这个查询将会非常慢,即使在如像 MySQL 这样快的数据库中执行也会很慢。而这还是每个表中只有 1000 行的情形。如果每个表中有一百万行时,将会怎样?很显然,这样将会产生性能极为低下的结果。如果对每个表进行索引,就能极大地加速查询进程,因为利用索引的查询处理如下:

1) 如下从表 t1 中选择第一行,查看此行所包含的值。

2) 使用表 t2 上的索引,直接跳到 t2 中与来自 t1 的值匹配的行。类似,利用表 t3 上的索引,直接跳到 t3 中与来自 t1 的值匹配的行。

3) 进到表 t1 的下一行并重复前面的过程直到 t1 中所有的行已经查过。

在此情形下,我们仍然对表 t1 执行了一个完全扫描,但能够在表 t2 t3 上进行索引查找直接取出这些表中的行。从道理上说,这时的查询比未用索引时要快一百万倍。

如上所述,MySQL 利用索引加速了 WHERE 子句中与条件相配的行的搜索,或者说在执行连接时加快了与其他表中的行匹配的行的搜索。

分享到:
评论

相关推荐

    mssql索引优化工具

    "mssql索引优化工具"是一种专门针对SQL Server数据库进行索引优化的应用,它可以自动分析数据库中的大表,并建议或自动创建合适的索引,以提高查询效率。 1. **索引基础** - 索引是数据库中用于加速查询的数据结构...

    04-VIP-Mysql索引优化实战一.pdf

    MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...

    Oracle数据库索引优化方法探析.pdf

    索引优化方法有多种,包括重新设计索引、避免系统排序和使用函数索引等。重新设计索引可以避免全表扫描操作,降低资源消耗,缩短执行时间。避免系统排序可以减少排序操作的时间和空间消耗。使用函数索引可以提高查询...

    mysql的索引优化

    ### MySQL的索引优化 #### 一、索引的基本概念 索引是在数据库表中用于提高数据检索效率的重要工具。简单来说,索引就像是图书的目录页,可以帮助用户快速定位到所需的信息,而无需逐页查找。对于MySQL而言,所有...

    Oracle索引优化

    Oracle索引优化是数据库性能调优的关键环节,它关乎到数据检索速度和整体系统的效率。在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型...

    数据库索引设计和优化

    三、索引优化 1. 选择性:索引的选择性越高,表示索引区分度越大,查询性能通常越好。选择性低的列不适合建立索引。 2. 索引维护:索引需要随着数据的增删改进行维护,因此要考虑操作频率和复杂度。 3. 分区索引:...

    mysql查询优化之索引优化

    MySQL查询优化是数据库管理中的关键环节,特别是在大数据量的场景下,索引优化能显著提升查询性能。本文将深入探讨“mysql查询优化之索引优化”这一主题。 首先,了解索引的基本概念至关重要。索引是数据库为了快速...

    Oracle索引优化相关

    ### Oracle索引优化相关知识点详解 #### 一、基本索引概念 在Oracle数据库中,索引是提高数据检索速度的重要工具。通过查询`DBA_INDEXES`视图,可以获取到当前数据库中所有表的所有索引信息。需要注意的是,如果...

    索引优化优化优化优化索引优化优化优化优化

    综上所述,通过对ABAP环境下索引优化的深入探讨,我们可以看到合理使用工具(如SE30、DB02、ST05等)以及精心设计索引是非常重要的。这不仅能够有效提高系统的查询性能,还能为用户提供更好的使用体验。

    MySQL索引优化课件

    MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...

    DB2索引及其优化(设计,优化,问题分析,解答,举例)

    DB2索引及其优化 DB2索引设计及其优化是...在本文中,我们讨论了DB2索引的概念、创建索引、建立索引注意事项、索引分类和索引优化等方面的知识点,并提供了一些有用的提示和建议,以帮助读者更好地理解和应用DB2索引。

    MySQL中索引优化distinct语句及distinct的多字段操作

    在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例.   实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...

    尚硅谷mysql高级:索引、优化

    2. 索引优化:合理设计索引,根据查询模式创建最合适的索引。避免索引过多,因为这会增加写操作的开销。 3. 数据库设计:遵循第三范式,减少数据冗余,提高数据一致性。考虑数据分布,合理分区和分表。 4. 存储...

    藏经阁-MySQL表和索引优化实战-11页

    MySQL 表和索引优化实战 MySQL 表和索引优化实战是指在 MySQL 数据库中对表和索引进行优化,以提高查询效率和存储空间利用率。本文将从 MySQL 表和索引的基本概念出发,探讨 MySQL 表和索引优化的实战经验和技巧。...

    数据库 索引及优化

    - **查询优化**:避免不必要的全表扫描,尽可能使用索引来减少查询时间。 - **硬件升级**:增加内存容量、使用更快的磁盘驱动器等。 - **数据库结构调整**:如分区表、优化表结构等。 综上所述,合理的索引设计与...

    sql数据库优化--使用索引优化存储过程

    在SQL数据库优化中,使用索引来优化存储过程是一个关键的策略,特别是在处理大量数据时。在这个特定案例中,原始的存储过程执行时间高达25秒,而在经过一系列的优化后,执行时间降低到3到4秒,显著提高了效率。 ...

    SQL Server 2000完结篇系列之七:SQL Server 2000索引优化详解

    本文将深入探讨SQL Server 2000中的索引优化,旨在帮助数据库管理员和开发人员理解如何有效地利用索引来提升系统性能。 一、索引的基本概念 索引是一种特殊的数据结构,它允许数据库快速定位到表中的特定行,类似于...

    MySQL索引分析及优化.pdf

    索引的优化是指通过合理地使用索引来提高查询速度和减少数据库负载。索引的优化可以从以下几个方面入手: * 选择合适的索引类型:选择合适的索引类型可以提高查询速度和减少数据库负载。 *合理地使用索引:合理地...

Global site tag (gtag.js) - Google Analytics