mysql CREATE INDEX 语句

说明 

此语句用于创建指定表的索引。索引可以提高数据库的性能。

语法 

CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX index-name
ON [ owner.]table-name
column-name [ ASC | DESC ], ...
    | function-name ( argument [ ,... ] ) AS column-name )
[ { IN | ON } dbspace-name ]

参数 

VIRTUAL 关键字    VIRTUAL 关键字主要由索引顾问使用。在索引顾问对查询计划进行求值期间以及使用 PLAN 函数时,虚拟索引将模拟真实物理索引的属性。可以结合使用虚拟索引和 PLAN 函数以充分利用索引在性能方面的提高,从而避免创建真实索引这一通常又耗时又消耗资源的过程。

虚拟索引对其它连接是不可见的,并且在关闭连接时删除。在对查询的实际执行计划进行求值时不使用虚拟索引,所以不会对性能造成影响。

虚拟索引的列数限制为四列。

有关详细信息,请参见启动索引顾问索引顾问概述

CLUSTERED 关键字    CLUSTERED 属性使表行按照与索引对应的大概键顺序来存储。当服务器尝试保留键顺序时,不保证实施总体群集。

如果存在聚簇索引,LOAD TABLE 语句便按照索引键的顺序在表中插入行,而 INSERT 语句将按照键顺序的定义尝试将新行添加到包含相邻行的表页上。

有关详细信息,请参见使用聚簇索引

UNIQUE 关键字    UNIQUE 属性确保表中不会有两行的值在所有索引列中相同。每个索引键必须是唯一的,或者至少在一列中包含 NULL。

表的唯一约束和唯一索引是有区别的。唯一索引的列可以为 NULL,而唯一约束的列不能为 NULL。外键可以引用主键或者具有唯一约束的列,但不能引用具有唯一索引的列,因为唯一索引可以包括多个 NULL 实例。

ASC | DESC 选项    除非显式指定降序 (DESC),否则列以升序 (increasing) 排序。不管索引是升序排列还是降序排列,在执行升序或降序 ORDER BY 操作时都会使用索引。但是,如果通过混合的升序和降序属性来执行 ORDER BY,则仅当索引是用同样的升序和降序属性创建的时才使用索引。

function-name 参数    function-name 参数为内置函数创建索引。CREATE INDEX 语句的这种格式是执行以下操作的便捷方法:

  1. 向表中添加名为 column-name 的计算列。该列通过指定为内置函数的 COMPUTE 子句以及任何所指定的参数来定义。该列的数据类型依函数的返回类型而定。

  2. 填充表中现有行的计算列。

  3. 创建列的索引。

删除索引不会造成相关联的列被删除。CREATE INDEX 的这一格式不可用于所声明的临时表。

有关列计算列的详细信息,请参见使用计算列

IN | ON 子句    缺省情况下,索引放在它的表所在的同一个数据库文件中。通过指定用来存放索引的 dbspace 名称,可以将索引放在单独的数据库文件中。此特性主要用于帮助大型数据库克服文件大小限制。

有关限制的详细信息,请参见大小和数量限制

用法 

CREATE INDEX 语句在指定表的指定列上创建排序索引。索引自动用于改进向数据库发出的查询的性能,以及通过 ORDER BY 子句对查询排序。索引一旦创建,在 SQL 语句中就不会再引用它,除非要校验 (VALIDATE INDEX) 或删除 (DROP INDEX) 它。

不能创建视图索引。

  • 索引所有权    在 CREATE INDEX 语句中无法指定索引所有者。索引总是归表的所有者所拥有。索引名称对每个所有者必须是唯一的。

  • 不存在视图索引    无法为视图创建索引。

  • 索引名称空间    每个索引的名称对给定的表必须是唯一的。

  • 排它表使用    只要 CREATE INDEX 影响了当前正由其它连接使用的表,就会禁止该语句。CREATE INDEX 可能很耗时,服务器在处理该语句时不会处理引用同一个表的请求。

  • 自动创建的索引    Adaptive Server Anywhere 自动创建主键和唯一约束的索引。这些自动创建的索引保存在表所在的同一数据库文件中。

权限 

必须是表的所有者,或者有 DBA 权限或 REFERENCES 权限。

副作用 

自动提交。为内置函数创建索引也会生成一个检查点。

更新列统计信息。

另请参见 
标准和兼容性 
  • SQL/92    供应商扩展。

  • SQL/99    供应商扩展。

  • Sybase    Adaptive Server Enterprise 的 CREATE INDEX 语句比 Adaptive Server Anywhere 的复杂。虽然在 Adaptive Server Anywhere 中允许使用 Adaptive Server Enterprise 语法,但一些子句和关键字会被忽略。

    • Adaptive Server Enterprise 11.5 的完整语法如下:

      CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
      INDEX index-name
      ON [ [ database.]owner.]table_name
            (column_name [, column_name], ...)
       [ WITH {
         {  FILLFACTOR | MAX_ROWS_PER_PAGE } = x,
             CONSUMERS = x,
         ... IGNORE_DUP_KEY,
         ... SORTED_DATA,
             [ IGNORE_DUP_ROW | ALLOW_DUP_ROW ]
         } ]
       [ ON segment_name ]

    Adaptive Server Anywhere 允许使用(通过忽略)以下关键字:

    • FILLFACTOR

    • IGNORE_DUP_KEY

    • SORTED_DATA

    • IGNORE_DUP_ROW

    • ALLOW_DUP_ROW

    在 Adaptive Server Enterprise 和 Adaptive Server Anywhere 中,索引的物理放置方式是不同的。Adaptive Server Anywhere 支持 ON segment-name 子句,但 segment-name 引用 dbspace。

    Adaptive Server Anywhere 中的唯一索引允许包含 NULL,其它方面都相同。Adaptive Server Enterprise 中的唯一索引允许最多一个空值的行,不允许重复的行。

    对于 Adaptive Server Anywhere 和 Enterprise,给定表的索引名称必须都是唯一的。

示例 

为 employee 表创建一个有两列的索引。

CREATE INDEX employee_name_index
ON employee
( emp_lname, emp_fname )

为 sales_order_items 表的 prod_id 列创建索引。

CREATE INDEX item_prod
ON sales_order_items
( prod_id )

使用 SORTKEY 函数为 product 表的 description 列创建索引,排序顺序根据俄语归类而定。该语句有一个副作用,向表中添加一个计算列 desc_ru。

CREATE INDEX ix_desc_ru
ON product (
 SORTKEY( description, 'rusdict' )
 AS desc_ru )
原文地址:https://www.cnblogs.com/tudou1223/p/8464843.html