1、索引介绍:

2、建立索引的方法:

注意:索引名称不要相同;

(1)在建表的时候,可以增加主键索引的语句如下:

1)例一:

create table student1 (

id int(4) not null auto_increment,

name varchar(20) not null,

primary key (id),

key index_name (name)

);

primary key(id), #设置主键索引,主键索引是id字段;

key index_name(name) #设置普通索引,index_name代表是索引的名称,name是索引列;

mysql> desc student1;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

|name| varchar(20)| NO | MUL | NULL | |

+-------+-------------+------+-----+---------+----------------+

2 rows in set (0.00 sec)

PRI:表示的是主键索引;

MUL:表示的普通索引;

2)例二:

3)唯一索引:

在建表时在需要列中加 uniq 参数;

(2)在建表后给表添加索引:

1)添加主键索引:

mysql> alter table student change id id int primary key auto_increment;

提示:删除主键的方法:alter table student drop primary key;

当表有主键索引时不好删除,不会去动删除主键的;

2)添加普通索引:

删除名为"index_name"的普通索引(因为前面在建表时已经添加过了索引);

方法一:

mysql> alter table student1 drop index index_name;

方法二:

mysql> drop index index_name on student1;

添加名为"index_name"的普通索引:

方法一:

mysql> alter table student1 add index index_name (name);

方法二:

mysql>create index index_name on student1 (name);

3)对字段的前n个字符创建索引:

方法一:

mysql>alter table student1 add index index_name1 (name(8));

index_name1 :代表索引的名字;

student(name(8)):代表取student表name字段的前8个字符;

方法二:

mysql> create index index_name1 on student1 (name(8));

4)查看表的详细索引:
mysql> show index from student1\G

*************************** 1. row ***************************

Table: student1

Non_unique: 0 #是否唯一:是

Key_name: PRIMARY #索引名称为"PRIMARY"主建索引;

Seq_in_index: 1 #联合索引;

Column_name: id #列名;

Collation: A

Cardinality: 0

Sub_part: NULL #索引范围;

Packed: NULL

Null:

Index_type: BTREE #btree索引类型(默认);

Comment: #字段描述;

Index_comment:

*************************** 2. row ***************************

Table: student1

Non_unique: 1

Key_name: index_name

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 3. row ***************************

Table: student1

Non_unique: 1

Key_name: index_name1

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: 8

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

5)为表的多个字段字段创建联合索引:

联合索引允许表的字段上有自己的索引:

方法一:

mysql> alter table student add index index_name_dept (name,dept(8));

方法二:

mysql> create index index_name_dept on student (name,dept(8));

查看索引:

mysql> show index from student\G;

*************************** 1. row ***************************

Table: student

Non_unique: 0

Key_name: PRIMARY

Seq_in_index: 1

Column_name: id

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 2. row ***************************

Table: student

Non_unique: 1

Key_name: index_name_dept

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 3. row ***************************

Table: student

Non_unique: 1

Key_name: index_name_dept

Seq_in_index: 2

Column_name: dept

Collation: A

Cardinality: 0

Sub_part: 8

Packed: NULL

Null: YES

Index_type: BTREE

Comment:

Index_comment:

ERROR:

No query specified

6)创建唯一索引(非主键):

方法一:

mysql> alter table student1 add unique index uniq_name (name);

方法二:

mysql> create unique index uniq_name on student1 (name);

查看:

mysql> desc student1;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name| varchar(20) |NO | UNI | NULL | |

+-------+-------------+------+-----+---------+----------------+

2 rows in set (0.00 sec)

mysql> show index from student1\G;

*************************** 2. row ***************************

Table: student1

Non_unique: 0

Key_name: uniq_name

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

show index from table\G;参数详解:

Table

#表的名称。

Non_unique

#如果索引不能包括重复词,则为0。如果可以,则为1。

Key_name

#索引的名称。

Seq_in_index

#索引中的列序列号,从1开始。

Column_name

#列名称。

Collation

#列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。[InnoDB都是A,Heap表都是NULL]

Cardinality

#非常关键的一个参数。表示的是索引中唯一值的数目的估计值。

#Cardinality/n_rows_in_table的值应尽可能接近1,如果非常小,那么用户需要考虑是否可以删除该索引。

Sub_part

#如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

Packed

#指示关键字如何被压缩。如果没有被压缩,则为NULL。

Null

#索引的列中含有NULL。含有NULL则为YES。如果没有,则这里显示为空。

Index_type

#索引的类型(BTREE, FULLTEXT, HASH, RTREE)。这里是InnoDB存储引擎,所以显示的都是BTREE

Comment

#多种评注。

3、主键索引和唯一索引的区别:

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

主键创建后一定包含一个列不为空的唯一性索引,唯一性索引并不一定就是主键。

唯一性索引列允许空值,而主键列不允许为空值。

主键可以被其他表引用为外键,而唯一索引不能。

一个表最多只能创建一个主键,但可以创建多个唯一索引。

主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。

4、索引列的创建及生效的条件:

5、创建索引命令总结:

(1)创建主键索引:

alter table student change id id int primary key auto_increment;

(2)删除主键索引:

alter table student drop primary key;

(3)创建普通索引:

alter table student add index index_name (name);

create index index_name on student (name);

(4)删除普通索引:

alter table student drop index index_name;

drop index index_name on student;

(5)根据前n个字符创建索引:

alter table student add index index_name (name(8));

create index index_name on student (name(8));

(6)根据多个列创建联合索引:

alter table student add index index_name_dept (name,dept(8));

create index index_name_dept on student (name,dept (8));

(7)创建唯一索引:

alter table student add unique index uniq_name (name);

create unique index uniq_name on student (name);

(8)查看索引:

1)通过表结构查看:

desc student;

2)通过索引命令查看:

show index from student;

(9)创建索引要注意的时间:

1)要在表的列上创建索引;

2)索引会加快查询的速度,但是会影响更新速度;

3)索引不是越多多好,要在频繁查询的where后的条件列上创建索引;

4)小表或唯一值极少的列上不建索引,要在大表及不同内容多的列上创建索引;

5)一般"="查询会走索引,一般模糊查询不会走索引;

6)一般不会使用mysql的索引,而是使用其它的索引软件,因为mysql自带的索引效果很差;

11.1、DML之select语句:

1、语法:

(1)根据指定的字段查询数据:

select <字段1,字段2,.....> from <表名> where <表达式>;

#select,from,where是不能够随便改的,是关键字,支持大小写;

(2)查询表结构中所有字段的数据:

select * from <表名> where <表达式>;

(3)优化:最好不要用"*"去查询数据,因为太慢了,最好是指定字段去查询数据;

2、应用实例:

(1)查询表中的所有数据:

mysql> select * from test;

+----+------+------+

| id | name | age |

+----+------+------+

| 1 | lc | 20 |

| 2 | lc1 | 21 |

| 3 | lc3 | 22 |

| 4 | lc4 | 23 |

+----+------+------+

4 rows in set (0.00 sec)

(2)根据指定的字段查询数据:

mysql> select id,name,age from test where name='lc3' or age='21' order by id desc;

+----+------+------+

| id | name | age |

+----+------+------+

| 5 | lc3 | 22 |

| 3 | lc3 | 22 |

| 2 | lc1 | 21 |

+----+------+------+

3 rows in set (0.00 sec)

#or:代表"或",并集;and:代表"与",交集;desc:代表降序;asc:代表升序,默认的就是升序;

(3)select多表连表查询:

1)连表查询说明:

连表查询时表要至少有一个外键(外键是指:一张表的主键字段和另一张表主键的字段相同),或者

两个表中有相同的字段,并且是唯一值且不为空;

连表查询时一般运维不会用到,了解即可,这些一般是开发在用;

2)建表时建立外键时使用的参数语句是:

foreign key(id) references outTable(id) on delete cascade on update cascade

#表示把id列设为外键,参照外表outTable的id列,当外键的值删除,本表中对应的列筛除,当外键的值改变,本表中对应的列值改变。

3)连表查询语句:

mysql> select student.id,test.name from student,test where student.id = test.id and student.name = test.name order by name;

(4)查看执行计划,判断查询语句是否走索引:

1)没有建立索引的时候:

mysql> explain select * from test where name='lc'\G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE #查询类型为简单查询;

table: test #查询的表;

type: ALL

possible_keys: NULL #可能走的索引,没有;

key: NULL #没有索引;

key_len: NULL

#显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。

#使用的索引的长度。在不损失精确性的情况下,长度越短越好。

ref: NULL

#显示使用哪个列或常数与key一起从表中选择行,主要判断索引的利用率,一个字段表示一个const;

rows: 5 #扫描的行数;

Extra: Using where

1 row in set (0.00 sec)

ERROR:

No query specified

2、在name字段上建立索引后查询:

mysql> alter table test add index index_name (name);

mysql> explain select * from test where name='lc'\G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: test

type: ref

possible_keys: index_name

key: index_name

key_len: 22

ref: const

rows: 2

Extra: Using where

1 row in set (0.01 sec)

ERROR:

No query specified

11、mysql索引详解的更多相关文章

  1. 【详细解析】MySQL索引详解( 索引概念、6大索引类型、key 和 index 的区别、其他索引方式)

    [详细解析]MySQL索引详解( 索引概念.6大索引类型.key 和 index 的区别.其他索引方式) MySQL索引的概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分 ...

  2. [转]mysql索引详解

    转自:http://www.cnblogs.com/ggjucheng/archive/2012/11/04/2754128.html 什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQ ...

  3. MySQL 索引详解大全

    什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2. 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结 ...

  4. 最全面的 MySQL 索引详解

    什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构 ...

  5. mysql索引详解(转)

    什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的 ...

  6. Mysql索引详解及优化(key和index区别)

    MySQL索引的概念    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库 ...

  7. mysql 索引 详解

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  8. MySQL 索引详解

    本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用. 索引是一种特殊 ...

  9. mysql索引详解,摘自《MySQL 5权威指南》

    本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用.本文摘自< ...

随机推荐

  1. [刷题] PTA 6-10 阶乘计算升级版

    要求: 实现一个打印非负整数阶乘的函数 N是用户传入的参数,其值不超过1000.如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印"Invalid input" 1 # ...

  2. [刷题] 237 Delete Nodes in a Linked List

    要求 给定链表中的一个节点,删除该节点 思路 通过改变节点的值实现  实现 1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(in ...

  3. R语言执行脚本的几种命令

    R CMD BATCH 和 Rscript 使用前都要先添加环境变量 把 C:\Program Files\R\R-3.3.0\bin; 加到"系统变量"的Path 值的最开始 可 ...

  4. k8s健康检查(9)

    一.默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readines ...

  5. Apache Flink 1.12.0 正式发布,DataSet API 将被弃用,真正的流批一体

    Apache Flink 1.12.0 正式发布 Apache Flink 社区很荣幸地宣布 Flink 1.12.0 版本正式发布!近 300 位贡献者参与了 Flink 1.12.0 的开发,提交 ...

  6. Linux服务之DNS服务篇

    一.DNS服务概述 DNS(Domain Name System)域名系统,在TCP/IP 网络中有非常重要的地位,能够提供域名与IP地址的解析服务. DNS 是一个分布式数据库,命名系统采用层次的逻 ...

  7. MongoDB(12)- 查询嵌入文档的数组

    插入测试数据 db.inventory.insertMany( [ { item: "journal", instock: [ { warehouse: "A" ...

  8. 快速人体姿态估计:CVPR2019论文阅读

    快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...

  9. NVIDIA深度学习Tensor Core性能解析(上)

    NVIDIA深度学习Tensor Core性能解析(上) 本篇将通过多项测试来考验Volta架构,利用各种深度学习框架来了解Tensor Core的性能. 很多时候,深度学习这样的新领域会让人难以理解 ...

  10. HLS后端示例

    HLS后端示例 TVM支持带有SDAccel的Xilinx FPGA板.这是有关如何将TVM部署到AWS F1 FPGA实例的文档. 此功能仍处于试验阶段.暂时无法使用SDAccel部署端到端神经网络 ...