精华内容
下载资源
问答
  • 数据库添加索引

    万次阅读 2017-10-25 09:56:05
    1.MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引。基本的语法格式如下: CREATE TABLE 表名(字段名 数据类型 [完整性约束条件], [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY ...

    1.MySQL在创建数据表的时候创建索引

    在MySQL中创建表的时候,可以直接创建索引。基本的语法格式如下:

    CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
                      [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
                      [索引名](字段名1 [(长度)] [ASC | DESC])
    );
    • UNIQUE:可选。表示索引为唯一性索引。
    • FULLTEXT;可选。表示索引为全文索引。
    • SPATIAL:可选。表示索引为空间索引。
    • INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。
    • 索引名:可选。给创建的索引取一个新名称。
    • 字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。
    • 长度:可选。指索引的长度,必须是字符串类型才可以使用。
    • ASC:可选。表示升序排列。
    • DESC:可选。表示降序排列。

    MySQL创建普通索引

    创建一个普通索引时,不需要加任何UNIQUE、FULLTEXT或者SPATIAL参数。

    实例:创建一个名为index1的数据表,在表内的id字段上建立一个普通索引。

    1. 创建普通索引的SQL代码如下:

    CREATE TABLE index1(id INT,
                        name VARCHAR(20),
                        sex BOOLEAN,
                        INDEX(id)
    );

              在DOS提示符窗口中查看MySQL创建普通索引的操作效果。如下图所示:

               

               从上图中可以看出,运行结果显示普通索引创建成功。

    2. 使用SHOW CREATE TABLE语句查看表的结构。如下图所示:

                   

                  从上图中可以看出,在id字段上已经建立了一个名为id的普通索引。

          语句:

          KEY `id` (`id`)

    圆括号内的id是字段名称,圆括号左侧外面的id是索引名称。

    3. 使用EXPLAIN语句查看索引是否被使用。SQL代码如下:

        EXPLAIN SELECT * FROM index1 where id=1 \G

    在DOS提示符窗口中查看使用EXPLAIN语句查看索引是否被使用的操作效果。如下图所示:

            

          上图中的结果显示,possible_keys和key的值都为id。说明id索引已经存在,并且查询时已经使用了索引。


    MySQL创建唯一性索引

    如果使用UNIQUE参数进行约束,则可以创建唯一性索引。

    实例:创建一个名为index2的数据表,在表内的id字段上建立一个唯一性索引,并且设置id字段以升序的形式排列。

    1. 创建一个唯一性索引的SQL代码如下:

    CREATE TABLE index2(id INT UNIQUE,
                        name VARCHAR(20),
                        UNIQUE INDEX index2_id(id ASC)
    );

    index2_id是为唯一性索引起的一个新名字。

          在DOS提示符窗口中查看MySQL创建唯一性索引的操作效果。如下图所示:

            

            从上图中可以看出,运行结果显示创建成功。

    2. 使用SHOW CREATE TABLE语句查看表的结构。SQL代码如下:

    SHOW CREATE TABLE index2 \G

    在DOS提示符窗口中查看使用SHOW CREATE TABLE语句查看表的结构的效果。如下图所示:

           

    从上图中可以看出,在id字段上建立了名为id和index2_id的两个唯一性索引。这样做,可以提高数据的查询速度。

    如果在创建index2表时,id字段没有进行唯一性结束。如下所示:

    CREATE TABLE index2(id INT,
                        name VARCHAR(20),
                        UNIQUE INDEX index2_id(id ASC)
    );

    则也可以在id字段上成功创建名为index2_id的唯一性索引。但是,这样可能达不到提高查询速度的目的。


    MySQL创建全文索引

    全文索引使用FULLTEXT参数,并且只能在CHAR、VARCHAR或TEXT类型的字段上创建。

    全文索引可以用于全文搜索。

    现在,MyISAM存储引擎和InnoDB存储引擎都支持全文索引。

    实例:创建一个名为index3的数据表,在表中的info字段上建立名为index3_info的全文索引。

    1. 创建全文索引的SQL代码如下:

    CREATE TABLE index3(id INT,
                        info VARCHAR(20),
                        FULLTEXT INDEX index3_info(info)
    )ENGINE=MyISAM;

    如果设置ENGINE=InnoDB,则可以在InnoDB存储引擎上创建全文索引。

    在DOS提示符窗口中查看MySQL创建全文索引的操作效果。如下图所示:

             

    从上图中可以看出,代码的执行结果显示创建成功。

    2. 使用SHOW CREATE TABLE语句查看index3数据表的结构。如下图所示:

    从上图中可以看出,在info字段上已经建立了一个名为index3_info的全文索引。

    注意

    我使用的是MySQL 5.6.19版本,已经可以在InnoDB存储引擎中创建全文索引了。

    全文索引非常适合于大型数据集,对于小的数据集,它的用处可能比较小。


    MySQL创建单列索引

    单列索引是在数据表的单个字段上创建的索引。一个表中可以创建多个单列索引。唯一性索引和普通索引等都为单列索引。

    实例:创建一个名为index4的数据表,在表中的subject字段上建立名为index4_st的单列索引。

    1. 创建单列索引的SQL代码如下:

    CREATE TABLE index4(id INT,
                        subject VARCHAR(30),
                        INDEX index4_st(subject(10))
    );

    在DOS提示符窗口中查看MySQL创建单列索引的操作效果。如下图所示:

           

    从上图中可以看出,代码执行的结果显示创建成功。

    2. 使用SHOW CREATE TABLE语句查看index4数据表的结构。如下图所示:

              

    从上图中可以看出,在subject字段上已经建立了一个名为index4_st的单列索引。

    注意:subject字段长度为30,而index4_st设置的索引长度只有10,这样做是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,而只查询它前面的若干字符信息。


    MySQL创建多列索引

    创建多列索引是在表的多个字段上创建一个索引。

    实例:创建一个名为index5的数据表,在表中的name和sex字段上建立名为index5_ns的多列索引。

    1. 创建多列索引的SQL代码如下:

    CREATE TABLE index5(id INT,
                        name VARCHAR(20),
                        sex CHAR(4),
                        INDEX index5_ns(name,sex)
    );

    在DOS提示符窗口中查看MySQL创建多列索引的操作效果。如下图所示:

            

    从上图中可以看出,代码的执行结果显示index5_ns索引创建成功。

    2. 使用SHOW CREATE TABLE语句查看index5数据表的结构。如下图所示:

             

    从上图中可以看出,name和sex字段上已经建立了一个名为index5_ns的多列索引。

    3. 多列索引中,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。

    先在index5数据表中添加一些数据记录,然后使用EXPLAIN语句可以查看索引的使用情况。如果只是使用name字段作为查询条件进行查询。如下图所示:

              

    从上图中可以看出,possible_keys和key的值都是index5_ns。Extra(额外信息)显示正在使用索引。这说明使用name字段进行索引时,索引index5_ns已经被使用。

    4. 如果只使用sex字段作为查询条件进行查询。如下图所示:

               

    从上图中可以看出,possible_keys和key的值都是NULL。Extra(额外信息)显示正在使用where条件查询,而未使用索引。

    提示

    使用多列索引时一定要特别注意,只有使用了索引中的第一个字段时才会触发索引。如果没有使用索引中的第一个字段,那么这个多列索引就不会起作用。因此,在优化查询速度时,可以考虑优化多列索引。


    MySQL创建空间索引

    使用SPATIAL参数能够创建空间索引。创建空间索引时,表的存储引擎必须是MyISAM类型。而且,索引字段必须有非空约束。

    实例:创建一个名为index6的数据表,在表中的space字段上建立名为index6_sp的空间索引。

    1. 创建空间索引的SQL代码如下:

    CREATE TABLE index6(id INT,
                        space GEOMETRY NOT NULL,
                        SPATIAL INDEX index6_sp(space)
    )ENGINE=MyISAM;

    在DOS提示符窗口中查看MySQL创建空间索引的操作效果。如下图所示:

           

    从上图可以看出,代码执行的结果显示空间索引创建成功。

    2. 使用SHOW CREATE TABLE语句可看index6数据表的结构。如下图所示:

            

    从上图中可以看出,在space字段上已经建立了一个名为index6_sp的空间索引。

    注意,space字段是非空的,而且数据类型是GEOMETRY类型。这个类型是空间数据类型。

    空间数据类型包括GEOMETRY、POINT、LINESTRING和POLYGON类型等。这些空间数据类型平时很少用到

    2添加索引

    1.添加PRIMARY KEY(主键索引) 
    mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 
    2.添加UNIQUE(唯一索引) 
    mysql>ALTER TABLE `table_name` ADD UNIQUE ( 
    `column` 

    3.添加INDEX(普通索引) 
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 
    4.添加FULLTEXT(全文索引) 
    mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 
    5.添加多列索引 
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

    展开全文
  • 数据库添加索引

    千次阅读 2014-03-24 10:45:22
    PHP在连接数据库方面的确实是十分方便(译者注:有些人认为PHP在连接不同数据库时没有一个统一的接口,不太方便,其实这可以通过一些扩展库来... 前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊
      就象许多的
    PHP
    开发者一样,在刚开始建立动态网站的时候,我都是使用相对简单的数据结构。PHP在连接数据库方面的确实是十分方便(译者注:有些人认为PHP在连接不同数据库时没有一个统一的接口,不太方便,其实这可以通过一些扩展库来做到这一点),你无需看大量的设计文档就可以建立和使用数据库,这也是PHP获得成功的主要原因之一。 
    

      前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用 MySQL 的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头。

      最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。

      CREATE TABLE mytable (
         id serial primary key,
         category_id int not null default 0,
         user_id int not null default 0,
         adddate int not null default 0
      );

      很简单吧,不过对于要说明这个问题,已经足够了。如果你在查询时常用类似以下的语句:

       SELECT * FROM mytable WHERE category_id=1; 

      最直接的应对之道,是为category_id建立一个简单的索引:

       CREATE INDEX mytable_categoryid 
         ON mytable (category_id);

      OK,搞定?先别高兴,如果你有不止一个选择条件呢?例如:

       SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

      你的第一反应可能是,再给user_id建立一个索引。不好,这不是一个最佳的方法。你可以建立多重的索引。

      CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);

      注意到我在命名时的习惯了吗?我使用"表名_字段1名_字段2名"的方式。你很快就会知道我为什么这样做了。

      现在你已经为适当的字段建立了索引,不过,还是有点不放心吧,你可能会问,数据库会真正用到这些索引吗? 测试 一下就OK,对于大多数的数据库来说,这是很容易的,只要使用EXPLAIN命令:

      EXPLAIN

       SELECT * FROM mytable 
        WHERE category_id=1 AND user_id=2;

       This  is  what Postgres 7.1 returns (exactly as I expected) 

       NOTICE: QUERY PLAN:

       Index Scan using mytable_categoryid_userid on 
         mytable (cost=0.00..2.02 rows=1 width=16)

      EXPLAIN

    以上是postgres的数据,可以看到该数据库在查询的时候使用了一个索引(一个好开始),而且它使用的是我创建的第二个索引。看到我上面命名的好处了吧,你马上知道它使用适当的索引了。

    接着,来个稍微复杂一点的,如果有个ORDER BY字句呢?不管你信不信,大多数的数据库在使用order by的时候,都将会从索引中受益。

       SELECT * FROM mytable 
        WHERE category_id=1 AND user_id=2
         ORDER BY adddate DESC;

    有点迷惑了吧?很简单,就象为where字句中的字段建立一个索引一样,也为ORDER BY的字句中的字段建立一个索引:

       CREATE INDEX mytable_categoryid_userid_adddate
         ON mytable (category_id,user_id,adddate);

       注意: "mytable_categoryid_userid_adddate" 将会被截短为

       "mytable_categoryid_userid_addda"

       CREATE

       EXPLAIN SELECT * FROM mytable
        WHERE category_id=1 AND user_id=2
         ORDER BY adddate DESC;

       NOTICE: QUERY PLAN:

       Sort (cost=2.03..2.03 rows=1 width=16)
        -> Index Scan using mytable_categoryid_userid_addda 
           on mytable (cost=0.00..2.02 rows=1 width=16)

       EXPLAIN

      看看EXPLAIN的输出,好象有点恐怖啊,数据库多做了一个我们没有要求的排序,这下知道性能如何受损了吧,看来我们对于数据库的自身运作是有点过于乐观了,那么,给数据库多一点提示吧。

      为了跳过排序这一步,我们并不需要其它另外的索引,只要将查询语句稍微改一下。这里用的是postgres,我们将给该数据库一个额外的提示--在ORDER BY语句中,加入where语句中的字段。这只是一个技术上的处理,并不是必须的,因为实际上在另外两个字段上,并不会有任何的排序操作,不过如果加入,postgres将会知道哪些是它应该做的。

       EXPLAIN SELECT * FROM mytable 
        WHERE category_id=1 AND user_id=2
         ORDER BY category_id DESC,user_id DESC,adddate DESC;

       NOTICE: QUERY PLAN:

       Index Scan Backward using 
        mytable_categoryid_userid_addda on mytable 
         (cost=0.00..2.02 rows=1 width=16)

       EXPLAIN

    现在使用我们料想的索引了,而且它还挺聪明,知道可以从索引后面开始读,从而避免了任何的排序。

    以上说得细了一点,不过如果你的数据库非常巨大,并且每日的页面请求达上百万算,我想你会获益良多的。不过,如果你要做更为复杂的查询呢,例如将多张表结合起来查询,特别是where限制字句中的字段是来自不止一个表格时,应该怎样处理呢?我通常都尽量避免这种做法,因为这样数据库要将各个表中的东西都结合起来,然后再排除那些不合适的行,搞不好开销会很大。

      如果不能避免,你应该查看每张要结合起来的表,并且使用以上的策略来建立索引,然后再用EXPLAIN命令验证一下是否使用了你料想中的索引。如果是的话,就OK。不是的话,你可能要建立临时的表来将他们结合在一起,并且使用适当的索引。

      要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

      以上介绍的只是一些十分基本的东西,其实里面的学问也不少,单凭EXPLAIN我们是不能判定该方法是否就是最优化的,每个数据库都有自己的一些优化器,虽然可能还不太完善,但是它们都会在查询时对比过哪种方式较快,在某些情况下,建立索引的话也未必会快,例如索引放在一个不连续的存储空间时,这会增加读磁盘的负担,因此,哪个是最优,应该通过实际的使用环境来检验。

      在刚开始的时候,如果表不大,没有必要作索引,我的意见是在需要的时候才作索引,也可用一些命令来优化表,例如MySQL可用"OPTIMIZE TABLE"。

      综上所述,在如何为数据库建立恰当的索引方面,你应该有一些基本的概念了。

    原文链接:http://www.yesky.com/111/164611_2.shtml

    展开全文
  • sql优化之数据库添加索引

    千次阅读 2018-03-28 16:02:09
    mysql 为表添加索引索引作用在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍...

    mysql 为表添加索引

    索引作用

    在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。

    例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据组成,指为1~1000的数值,查找对应值相等行的查询如下所示。

    SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
    此查询结果应该为1000行,每行包含3个相等的值。在无索引的情况下处理此查询,必须寻找3个表所有的组合,以便得出与WHERE子句相配的那些行。而可能的组合数目为1000×1000×1000(十亿),显然查询将会非常慢。

    如果对每个表进行索引,就能极大地加速查询进程。利用索引的查询处理如下。

    (1)从表t1中选择第一行,查看此行所包含的数据。
    (2)使用表t2上的索引,直接定位t2中与t1的值匹配的行。类似,利用表t3上的索引,直接定位t3中与来自t1的值匹配的行。
    (3)扫描表t1的下一行并重复前面的过程,直到遍历t1中所有的行。

    在此情形下,仍然对表t1执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。
    利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在执行连接时加快了与其他表中的行匹配的速度。

     

     

    1.添加PRIMARY KEY(主键索引) 
    mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 
    2.添加UNIQUE(唯一索引) 
    mysql>ALTER TABLE `table_name` ADD UNIQUE ( 
    `column` 

    3.添加INDEX(普通索引) 
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 
    4.添加FULLTEXT(全文索引) 
    mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 
    5.添加多列索引 
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

    下面是更加详细的方法

    MySQL中可以使用alter table这个SQL语句来为表中的字段添加索引。

    使用alter table语句来为表中的字段添加索引的基本语法是:
    ALTER TABLE <表名> ADD INDEX (<字段>);

    我们来尝试为test中t_name字段添加一个索引。

    mysql> alter table test add index(t_name);
    Query OK, 0 rows affected (0.17 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    执行成功后,我们来看看结果。

    mysql> describe test;
    +------------+-------------+------+-----+---------+-------+
    | Field      | Type        | Null | Key | Default | Extra |
    +------------+-------------+------+-----+---------+-------+
    | t_id       | int(11)     | YES  |     | NULL    |       |
    | t_name     | varchar(50) | NO   | MUL | NULL    |       |
    | t_password | char(32)    | YES  |     | NULL    |       |
    | t_birth    | date        | YES  |     | NULL    |       |
    +------------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    结果可以看出,t_name字段的Key这一栏由原来的空白变成了MUL。这个MUL是什么意思呢?简单解释一下:如果Key是MUL,那么该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。

     

     

     

     

    2.  创建索引

    在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。

    1.ALTER TABLE

    ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

    1
    2
    3
    ALTER  TABLE  table_name ADD  INDEX  index_name (column_list)
    ALTER  TABLE  table_name ADD  UNIQUE  (column_list)
    ALTER  TABLE  table_name ADD  PRIMARY  KEY  (column_list)

    其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

    2.CREATE INDEX

    CREATE INDEX可对表增加普通索引或UNIQUE索引。

    1
    2
    CREATE  INDEX  index_name ON  table_name (column_list)
    CREATE  UNIQUE  INDEX  index_name ON  table_name (column_list)

    table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

    3.索引类型

    在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

    PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。

    下面的SQL语句对students表在sid上添加PRIMARY KEY索引。

     

    复制代码代码如下:
    ALTER TABLE students ADD PRIMARY KEY (sid)

     

    4.  删除索引

    可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

    1
    2
    3
    DROP  INDEX  index_name ON  talbe_name
    ALTER  TABLE  table_name DROP  INDEX  index_name
    ALTER  TABLE  table_name DROP  PRIMARY  KEY

    其中,前两条语句是等价的,删除掉table_name中的索引index_name。
    第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
    如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

    5.查看索引

    1
    2
    mysql> show index  from  tblname;
    mysql> show keys from  tblname;

    · Table
    表的名称。
    · Non_unique
    如果索引不能包括重复词,则为0。如果可以,则为1。
    · Key_name
    索引的名称。
    · Seq_in_index
    索引中的列序列号,从1开始。
    · Column_name
    列名称。
    · Collation
    列以什么方式存储在索引中。在MySQL中,有值‘A'(升序)或NULL(无分类)。
    · Cardinality
    索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。
    · Sub_part
    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
    · Packed
    指示关键字如何被压缩。如果没有被压缩,则为NULL。
    · Null
    如果列含有NULL,则含有YES。如果没有,则该列含有NO。
    · Index_type
    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
    · Comment

    展开全文
  • Oracle数据库添加索引注意事项

    千次阅读 2018-02-05 10:39:40
    1.确定是否有专门的索引空间。 --查看表所在的表空间 SELECT * FROM user_tables t WHERE t.table_name='TABLENAME'; --查看索引所在的索引空间 SELECT TABLESPACE_NAME FROM DBA_INDEXES WHERE INDEX_NAME='...

    1.确定是否有专门的索引空间。

    --查看表所在的表空间

    SELECT * FROM user_tables t WHERE t.table_name='TABLENAME';

    --查看索引所在的索引空间

    SELECT TABLESPACE_NAME FROM DBA_INDEXES WHERE INDEX_NAME='INDEXNAME';

    2.预估建立索引所需的空间大小。

    3.查看表空间剩余或者索引空间剩余。

    --查看空间剩余

    SELECT tablespace_name,sum(bytes)/1024/1024 free_space FROM dba_free_space where

    TABLESPACE_NAME='TABLESPACENAME' GROUP BY tablespace_name;

    4.如果表空间不足,则考虑增加表空间。根据实际情况预估所要增加的表空间大小。

    ALTER TABLESPACE TABLESPACENAME ADD DATAFILE '\oracle\oradata\anita_20180123.dbf' SIZE 3000m;

    5.执行建立索引的sql脚本。

    CREATE INDEX SCHEMA.INDEXNAME ONSCHEMA.TABLENAME(COLUMN) TABLESPACETABLESPACENAME ONLINE;

    6.收集统计信息。

    EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCHEMA',TABNAME => 'TABLENAME',CASCADE

    => TRUE);

    7.查看统计信息更新时间是否为当前时间。

    SELECT A.OWNER,A.TABLE_NAME,A.LAST_ANALYZED FROM DBA_TABLES A WHERE

    A.TABLE_NAME='TABLENAME';

    8.查看索引的更新时间是否为当前时间。

    SELECT B.OWNER,B.INDEX_NAME,B.LAST_ANALYZED FROM DBA_INDEXES B WHERE

    B.INDEX_NAME='INDEXNAME';

    9.查看一下sql语句的执行计划,索引是否生效。

    --先设置一下session

    alter session set statistics_level=all

    --执行完要查看计划的sql后,执行下面脚本

    select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

    注意事项:

    1.建立索引过程中可能会发生锁表现象。建议加上online关键字。

    2.如果数据量很大,则建立索引和收集统计信息的时间会很长。(5kw的数据量建立索引花费332s,收集统计信息花费448s,仅供参考)。

    3.注意大小写,表名,表空间名,索引名要全部大写。

    4.添加索引会引起更新和插入速度变慢,这个需要DBA自己估算可行性。

    5.如果发生锁表情况,则杀死锁表的进程,尝试执行下面sql:

    --查看哪个对象锁表。

    select session_id from v$locked_object;

    select sid,serial#,username,osuser from v$session where sid =1999;

    alter system kill session '1999,29133';

    展开全文
  • 数据库添加索引为什么能加快查询速度

    万次阅读 多人点赞 2018-03-23 09:47:06
    数据库建立索引为什么会加快查询速度 首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时...
  • 数据库添加索引

    千次阅读 2017-06-20 14:27:53
    1.添加PRIMARY KEY(主键索引) mysql> ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql> ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX...
  • 数据库索引和SQL语句

    千次阅读 2019-05-23 20:57:42
    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。 在表Student上按Sno降序建唯一索引 create unique index Stusno on Student (Sno desc); 删除Student表的Stusno...
  • mysql数据库索引的创建语句

    千次阅读 2017-07-29 10:54:07
    单列索引 CREATE INDEX 索引名 ON 表名(列名); 组合索引创建 create unique index 索引名 on 表名(列名1,列名2……)
  • 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在...
  • 数据库建表添加索引(一)

    千次阅读 2019-05-09 19:22:09
    索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。 例如,有3个未索引的表...
  • Oracle数据库索引及plsql索引添加

    千次阅读 2018-04-07 13:31:47
    做压力测试的时候,领导叫我根据项目里的sql语句数据库添加索引,了解了下数据库索引的概念及在plsql中的索引添加方法。索引是对表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息...
  • 优点: 可能有人知道索引的作用的是什么,例如知道索引可以提高查询效率,减少查询时编列全表,或者说,有了索引可按特定...索引还会占用物理空间,我们数据库的数据表是占用物理空间,索引也是要占用一定的空间,而...
  • 数据库使用的oracle数据库,可视化管理工具使用的PLSQL 查看表中的索引 选中表,右键, view -->indexes就可以查看到表中的索引 image.png 这里只能看到表中那些数据列有索引,但是如果先知道查询语句是否...
  • 数据库的唯一序列号添加唯一索引: ALTER TABLE table_nm ADD UNIQUE (SERIANUMBER); 出现 Duplicate entry '20180903141829852093' for key 'SERIANUMBER'错误,此序列号有重复数据,所以无...
  • 数据库适当添加索引进行查询优化

    千次阅读 2016-02-17 11:24:50
    添加索引: 显示数据表的已经添加了索引的字段 show index from m3u8_content; 用explain检测性能,语句为: explain select count(*) from m3u8_content where status=8; type由all变成了ref explain select ...
  • MySQL数据库:SQL语句

    千次阅读 2016-10-27 15:01:47
    MySQL数据库:SQL语句 MySQL数据库:完整性约束 MySQL数据库备份与还原 MySQL数据库:编码 1、SQL概述1.1 什么是SQLSQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以...
  • 数据库索引(index)介绍

    千次阅读 2019-01-16 10:14:15
    本文主要介绍数据库索引(index)的相关知识。 1 概述 1.1 What 数据库中的索引(index),是数据库管理系统(DBMS)中的一个排序的数据结构,用于协助快速查询、更新数据库表中的数据。 除了实际需要使用的...
  • 数据库常用建表语句

    千次阅读 2018-08-15 16:17:00
    Mysql数据库 常用操作语句 2017年09月16日 12:17:11 阅读数:629 用户管理:  1、新建用户:  >CREATE USER name IDENTIFIED BY 'ssapdrow';  2、更改密码:  >SET PASSWORD FOR name=PASSWORD('fdddfd');...
  • 数据库查询优化-添加索引

    千次阅读 2019-08-26 22:01:20
    数据库中,我们通过创建索引可以大大提高查询的速度,一个好的索引可以另SQL的查询更加效率。而一个错误的索引不仅带不来效率的提高,甚至会带来额外的系统开销 索引的基本操作 创建索引 建表时创建索引 建表的...
  • 数据库常用sql语句总结

    万次阅读 多人点赞 2018-12-14 16:16:32
    1.SELECT 语句 2.SELECT DISTINCT 语句 3.WHERE 子句 4.AND 和 OR 运算符 5.ORDER BY 语句 6.INSERT INTO 语句 7.Update 语句 8.DELETE 语句 二、高级 1.TOP 子句 2.LIKE 操作符 3.SQL 通配符 4.IN...
  • 数据库增加索引

    千次阅读 2014-03-19 11:44:29
    数据库增加索引是为了增加查询速度而对表字段 附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。 这里想把之前的索引学习笔记总结一下:  首先明白为什么索引会增加...
  • 非关系型数据库(NoSQL)数据库模型数据库的架构数据库索引数据库操作:事务 数据库介绍 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作...
  • 给表添加主键:alter table 表名add constraint 主键名 primary key(字段名) 如:alter table DC_ALARM add constraint PK_ALARMID primary key(ALARMID) 给表添加唯一键:alter table 表名 add constraint 唯一键...
  • 数据库索引

    千次阅读 2017-08-10 21:53:50
    唯一索引:字段数据是唯一的,数据内容里面能否为null,在一张表里面,是可以添加多个唯一索引。 全文索引:在比较老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引...
  • 数据库索引详解

    千次阅读 2017-04-08 10:43:43
    索引的重要性:当你的数据库的性能出现问题了,那么就重新优化你的索引吧,这能够解决80%的性能问题,由此可见索引的重要性,尤其在数据量越来越大的时候,影响更加的明显,一个最优的索引能够轻易的将查询性能提高...
  • 数据库建立索引的原则

    千次阅读 2010-11-03 16:15:00
    数据库建立索引的原则
  • oracle数据库建立索引

    2011-09-28 23:59:06
    oracle数据库中如何建立索引,建立索引有什么优势,索引该如何使用
  • 数据库基础语句

    万次阅读 多人点赞 2018-10-02 14:29:02
    文章目录DDL数据库索引DML查找语句以及注意事项DCL别名group by的注意事项常见问题sql语句的执行顺序where和having的区别Not null unique和primary key的区别内连接 左连接 右连接 外连接MySQL中between and的取值...
  • mysql索引语句(创建和查看)

    千次阅读 2019-10-13 07:43:35
    mysql索引语句mysql索引语句查看索引 show index from 数据库表名PRIMARY KEY(主键索引)UNIQUE(唯一索引)INDEX(普通索引)FULLTEXT(全文索引)多列索引1.普通索引。2.唯一索引。查看索引 mysql索引语句 查看索引 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,876
精华内容 74,750
关键字:

数据库添加索引语句