mysql数据表 唯一索引需要修改成普通索引 怎么改?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据表 唯一索引需要修改成普通索引 怎么改?相关的知识,希望对你有一定的参考价值。

mysql数据表 唯一索引需要修改成普通索引 怎么改?

    解决方案:先删除唯一索引,再在当前字段创建普通索引,参考下列说明以及SQL:

    普通索引

    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

    唯一索引

    普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。

    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

    删除索引

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

    DROP INDEX index_name ON talbe_name

    ALTER TABLE table_name DROP INDEX index_name

    ALTER TABLE table_name DROP PRIMARY KEY

    创建索引

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

    ALTER TABLE

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

    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)

     

参考技术A 修改表的结构之类的操作, 建议直接就用工具了, mysql数据库建议用phpMyadmin或者是Navicat, 看着字点点鼠标就行了 参考技术B 先创建普通表,复制到普通表。
然后删除,复制过来就行了。
参考技术C 删了重建
drop index xxx;
create index xxx on table_name(xxx);
参考技术D alter table xxx drop index xxx
alter table xxx add unique idx_xxx(xxx)

唯一索引和普通索引的区别是什么,什么时候需要建唯一

1. 知识背景

什么是索引?

一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中,索引是一种数据结构,一般是B-TREE 。

2. 知识剖析

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

创建索引时,你需要确保该索引是应用在SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度。

因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

普通索引

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。

只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {column} )

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

在对该列进行增或改时,首先会检查是否重复,在执行增改操作,否则报出duplica错误,拒绝操作。

mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {lolumn} )

3. 常见问题

如果表中没有所以会发生什么?

一旦我们运行这个查询,在查找名字AAA的过程中,数据库不得不对表中的每一行检索并确定名字是否为AAA。

由于我们想要得到每一个名字为AAA的用户信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。

所以,必须一行一行的查找直到最后一行这就意味数据库不得不检查上千行数据才能找到所以名字为AAA的用户。这就是所谓的全表扫描。

索引是怎么提升性能的?

因为索引基本上是用来存储列值的数据结构,这使查找这些列值更加快速。

如果索引使用最常用的数据结构-B-Tree-那么其中的数据是有序的。

假设我们在name一列上创建一个B-Tree索引。这意味着当我们用之前的SQL查找姓名是AAA的用户时,不需要再扫描全表,而是用索引查找去查找名字为AAA的用户。

因为索引已经按照按字母顺序排序。索引已经排序意味着查询一个名字会快很多,因为名字少字母为AAA的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。

4. 解决方案

使用索引的原则:        
1、装载数据后再建立索引。  
2、频繁搜索的列可以作为索引。    
3、在联接属性上建立索引(主外键)。    
4、经常排序分组的列。
5、删除不经常使用的索引。    
6、指定索引块的参数,如果将来会在表上执行大量的insert操作,建立索引时设定较大的ptcfree。    
7、指定索引所在的表空间,将表和索引放在不同的表空间上可以提高性能。   
8、对大型索引,考虑使用NOLOGGING子句创建大型索引。

不要在下面的列创建索引:
1、仅包含几个不同值得列。
2、表中仅包含几条记录。

DEMO

先创建user表

CREATE TABLE user(
id INT NOT NULL,
number INT NOT NULL
);

普通索引

ALTER TABLE USER ADD INDEX ID_INDEX(ID);

唯一索引

ALTER TABLE USER ADD UNIQUE NUMBER_INDEX(NUMBER);

查看索引

SHOW INDEX FROM USER;

在这里插入图片描述

以上是关于mysql数据表 唯一索引需要修改成普通索引 怎么改?的主要内容,如果未能解决你的问题,请参考以下文章

工作十年还分不清MySQL普通索引和唯一索引怎么办?

MySQL索引概述

唯一索引和普通索引的区别是什么,什么时候需要建唯一

MYsql索引相关

MySQL数据库之索引

09 | 普通索引和唯一索引,应该怎么选择?