注:本篇文章是对菜鸟教程中的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. Python 3 学习笔记之——变量作用域、模块和包

    1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python 的作用域一共 ...

  2. hyperledger composer

    hyperledger composer 网站搜集 https://hyperledger.github.io/composer/latest/introduction/introduction.ht ...

  3. HTML5的 input:file上传类型控制(转载)

    http://www.haorooms.com/post/input_file_leixing HTML5的 input:file上传类型控制 2014年8月29日 66352次浏览 一.input: ...

  4. sysctl -P 报错解决办法 error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

    error: "net.bridge.bridge-nf-call-ip6tables" is an unknown keyerror: "net.bridge.brid ...

  5. 团队项目-第五次Scrum 会议

    时间:10.31 时长:30分钟 地点:教室(主南201) 工作情况 团队成员 已完成任务 待完成任务 解小锐 修复在接受任务时,前端和后端对接中的bug 完成员工信息的简单初始化 陈鑫 完成hire ...

  6. Mybatis学习系列(五)关联查询

    前面几节的示例基本都是一些单表查询,实际项目中,经常用到关联表的查询,比如一对一,一对多等情况.在Java实体对象中,一对一和一对多可是使用包装对象解决,属性使用List或者Set来实现,在mybat ...

  7. elasticsearch 工具类

    <?php /** * Created by PhpStorm. * User: brady * Date: 2018/4/8 * Time: 10:31 * esticsearch helpe ...

  8. vue2.0 vue-cli项目中路由之间的参数传递

    1.首先配置路由, import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) export default new R ...

  9. [洛谷P3865]【模板】ST表

    题目大意:区间静态最大值 题解:ST表,zkw线段树 ST表: st[i][j]存[i,i+$j^{2}$-1]的最大值,查询时把区间分成两个长度相同的小区间(可重复) #include<cst ...

  10. Windows关机过程分析与快速关机

    原文链接:http://blog.csdn.net/flyoxs/article/details/3710367 Windows开机和关机慢,很多时候慢得令人抓狂.特别是做嵌入式开发时(如XPE和Wi ...