注:本篇文章是对菜鸟教程中的mysql索引(http://www.runoob.com/mysql/mysql-index.html)的翻译版本;添加了示例,便于理解;

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

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

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

CREATE INDEX indexName ON mytable(username(length));

注:indexName是索引名称,username是字段名

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

举例:

CREATE TABLE employee(
id INT,
sname VARCHAR(50),
age INT ,
PASSWORD VARCHAR(50)
);
#创建索引
CREATE INDEX index_sname ON employee(sname(20)); #注意添加索引的长度必须小于建表时给字段定义的长度,也可以不给长度,如:CREATE INDEX index_sname ON employee(sname);
#删除索引
DROP INDEX index_sname ON employee;

修改表结构(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)
举例:
ALTER TABLE employee ADD INDEX  index_sname(sname);#这里可以不指定索引的长度

创建表的时候直接指定

CREATE TABLE mytable(  

ID INT NOT NULL,   

username VARCHAR(16) NOT NULL,  

INDEX [indexName] (username(length))  

);

举例:
CREATE TABLE teacher(
id INT NOT NULL,
teachername VARCHAR(16) NOT NULL,
INDEX index_teachername(teachername(5))
); CREATE TABLE tea(
id INT NOT NULL,
teaname VARCHAR(16) NOT NULL,
INDEX (teaname)
);

删除索引的语法

DROP INDEX [indexName] ON mytable;

举例:
DROP INDEX index_sname ON employee;

唯一索引

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

创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))
举例:
CREATE TABLE tea(
id INT NOT NULL,
teaname VARCHAR(16) NOT NULL,
INDEX (teaname)
); CREATE UNIQUE INDEX index_teaname ON tea(teaname(4));
CREATE UNIQUE INDEX index_teaname ON tea(teaname);#也可以不给长度

修改表结构

ALTER table mytable ADD UNIQUE [indexName] (username(length))
举例:
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50) NOT NULL COMMENT "学生姓名",
age VARCHAR(50) NOT NULL COMMENT "学生年龄"
); ALTER TABLE student ADD UNIQUE index_sname (sname(20)); ALTER TABLE student ADD UNIQUE(sname);##也可以不指定长度 DROP INDEX index_sname ON student; SHOW INDEX FROM student;

创建表的时候直接指定

CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
举例:
CREATE TABLE cat(
id INT ,
catName VARCHAR(20),
UNIQUE INDEX index_catName(catName(5))
); CREATE TABLE dog(
id INT ,
dogName VARCHAR(20),
UNIQUE INDEX index_dogName(dogName)
);

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

也可以一次性给多个列添加索引(多列索引)

  • ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 ):  添加多列索引.

以下实例为在表中添加索引。

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
举例:
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50) NOT NULL COMMENT "学生姓名",
age VARCHAR(50) NOT NULL COMMENT "学生年龄"
);
ALTER TABLE student ADD INDEX  index_sname(sname);

你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

mysql> ALTER TABLE testalter_tbl DROP INDEX c;
举例:
ALTER TABLE student DROP INDEX index_sname;

使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;#先修改为--不为空
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);#然后添加主键
举例:
CREATE TABLE cat(
id INT ,
catName VARCHAR(20),
UNIQUE INDEX index_catName(catName(5))
);
ALTER TABLE cat MODIFY id INT NOT NULL; ALTER TABLE cat ADD PRIMARY KEY (id);

你也可以使用 ALTER 命令删除主键:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
ALTER TABLE cat DROP PRIMARY KEY;

删除主键时只需指定PRIMARY KEY(一个表只有一个主键),但在删除索引时,你必须知道索引名。


显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

尝试以下实例:

mysql> SHOW INDEX FROM table_name;

mysql索引语法及示例的更多相关文章

  1. MySQL索引语法+使用场景

    MySQL索引语法 建表时添加索引 建表同时建立单索引 CREATE TABLE t_user1(id INT , userName VARCHAR(20), PASSWORD VARCHAR(20) ...

  2. MySQL创建索引语法

    1.介绍: 所有mysql索引列类型都可以被索引,对来相关类使用索引可以提高select查询性能,根据mysql索引数,可以是最大索引与最小索引,每种存储引擎对每个表的至少支持16的索引.总索引长度为 ...

  3. MySQL ALTER语法的运用方法 && 操作索引和字段

    语法:alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER column_name ] or ADD INDEX [in ...

  4. MySQL 通过多个示例学习索引

    最近在准备面试,关于索引这一块,发现很多以前忽略的点,这里好好整理一下 首先为什么要建立索引 一本书,有章.节.段.行这种单位. 如果现在需要找一个内容:第9章>第2节>第3段>第4 ...

  5. MySQL索引与Index Condition Pushdown(employees示例)

    实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...

  6. 索引-mysql索引创建、查看、删除及使用示例

    mysql索引创建.查看.删除及使用示例 1.创建索引: ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引. ALTER TABLE table_name ADD ...

  7. mysql索引设计的注意事项(大量示例,收藏再看)

    mysql索引设计的注意事项(大量示例,收藏再看) 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过ke ...

  8. mysql 索引2

    /* 所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度. 所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型 ...

  9. MySQL索引分析与优化

    1.MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的 peopleid(999).在这个过程中,MySQL只需处理一个行就可以返回结果.如果没有“n ...

随机推荐

  1. [Effective Java] 创建和销毁对象篇

    [Effective Java] 创建和销毁对象篇 1. 优先考虑用静态工厂方法代替构造器 优点: - 静态工厂方法相比于构造器,它们有名称 - 不需要每次在使用的时候创建一个对象 - 可以返回原返回 ...

  2. [Mac]Mac OS X中WireShark的使用,及找不到网卡问题的解决方法

    1.WireShark依赖X11: 2.默认情况下Mac OS X是不安装X11的: 因此,在Mac上安装WireShark,首先找出Mac OS 安装DVD安装X11. 安装完以后 echo $DI ...

  3. Hadoop世界中的HelloWorld之WordCount具体分析

    MapReduce 应用举例:单词计数 WorldCount可以说是MapReduce中的helloworld了,下面来看看hadoop中的例子worldcount对其进行的处理过程,也能对mapre ...

  4. SourceTree git的管理工具使用教程1

    1SourceTree是一个window系统下的Git管理工具 2设置Git 工具——选项——Git设置 3拷贝远程的项目 新建/克隆(输入远程项目的url地址) 4验证(填写用户信息) 工具——选项 ...

  5. Mybatis学习系列(四)Mapper接口动态代理

    实现原理及规范 Mapper接口动态代理的方式需要手动编写Mapper接口,Mybatis框架将根据接口定义创建接口的动态代理对象,代理对象的方法体实现Mapper接口中定义的方法. 使用Mapper ...

  6. C语言单元测试

    转自http://blog.csdn.net/colin719/article/details/1420583 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开 ...

  7. 【EasyNetQ】- 基于topic的路由

    RabbitMQ具有非常酷的功能,基于主题的路由,允许订户根据多个标准过滤消息.主题是由与消息一起发布的点分隔的单词列表.例如,“stock.usd.nyse”或“book.uk.london”或“a ...

  8. js 给某个div增加class 样式(三种方式)

    第一种:      el.setAttribute('class','abc'); <!DOCTYPE HTML> <HTML> <HEAD> <meta c ...

  9. Hibernate常用方法之_删除

    1.使用session的delete方法 public void deleteUser(User user){ Session session = null; Transaction transact ...

  10. BZOJ3073 PA2011Journeys(线段树+bfs)

    线段树优化建图裸题.建两棵线段树,一棵表示入一棵表示出.对题中所给的边新建一个虚拟点,将两段区间拆成线段树上对应区间,出线段树中对应区间所表示的点向虚拟点连边权0的边,虚拟点向入线段树中对应区间所表示 ...