数据库原理与应用 第 14 章 · 上机二
课程第 14 章上机二 已经有白建了删掉它该建的不该建挡重复聚簇走一遍 版式
第 14 章 数据库物理结构设计、实施和运行维护 · 上机二

索引建在哪,主码那一个已经有了

课件第 9 页说主码上应该建唯一索引,可它本来就有。真要动手的是另外几列。
已完成 0 / 7
本 次 上 机 题 目
  1. 01主码的索引不用你建
  2. 02课件第 22 页那条索引
  3. 03把多余的那个索引去掉
  4. 04外码那一列最该建
  5. 05取值只有两个的列,建了也白建
  6. 06唯一索引在录入时就把关
  7. 07InnoDB 的主码就是聚簇索引
  8. 该建的建,不该建的不建
01
第 14 章 · 上机二

主码的索引不用你建

建完表先看一眼,PRIMARY 那一行已经在了。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

课件第 9 页说主码上应该建唯一索引,DBMS 建表时就替你建好了。

知道更多

Non_unique 那一栏是 0,就是唯一索引,重复的主码进不来。

想一想

那还需要自己在主码上再建一个吗?

02
第 14 章 · 上机二

课件第 22 页那条索引

课件那条索引建在 supid 上,照敲一遍看看。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

建得上,可是两行索引管同一列,后一个白占空间还拖慢写入。

知道更多更正

课件那条索引建在主码列上,主码自带索引,这一条是多余的。

想一想

为什么 MySQL 不拦住这种重复的索引?

03
第 14 章 · 上机二

把多余的那个索引去掉

DROP INDEX 之后再看一眼,回到只剩主码那一行。

对应讲义第 9 页 索引
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

真要建就建在常查的列上,比如按供应商名称找。

打个比方

字典前面只要一份目录,同一份印两遍,翻起来不会更快。

04
第 14 章 · 上机二

外码那一列最该建

包含表按订单查明细,orderid 是外码也是最常用的查询条件。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

联合主码只帮到 orderid,单查 commodityid 用不上,得自己补一个。

知道更多

联合索引像电话簿,先按姓排再按名排,只知道名字是查不动的。

想一想

把两列的顺序调过来,结论会变吗?

05
第 14 章 · 上机二

取值只有两个的列,建了也白建

地址表的性别只有男女两种,先算一算它能把数据分成几堆。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

性别把四行只分成两堆,查一次还要扫一半,索引救不了。

关键术语这个比值有名字

区分度selectivity
不同取值数除以总行数,越接近 1 越值得建

想一想

多少行的表上,性别索引才可能有点用?

06
第 14 章 · 上机二

唯一索引在录入时就把关

课件第 9 页说主码索引还能避免重复值录入,试一次。

对应讲义第 9 页 索引
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

两条都报 1062,一条是主码挡的,一条是刚加的唯一索引挡的。

分清楚两种索引

索引作用
普通只管查得快
唯一还管不重复

想一想

手机号加唯一约束,现实里合适吗?

07
第 14 章 · 上机二

InnoDB 的主码就是聚簇索引

课件第 8 页讲的聚集,在 MySQL 里主码已经替你做了。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

PRIMARY 那一行就是聚簇索引,行按主码顺序排着存,找到码就找到行。

知道更多

所以主码短一点划算,每个二级索引里都要再带一份主码。

想一想

主码用很长的字符串,代价在哪儿?

第 14 章 · 上机二

该建的建,不该建的不建

头一句先删干净,两张表建起来,索引挨个看一遍。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 shop 库,这一章要照课件那十张表的结构自己建出来。
mysql>

重 点

两张表最后各两个索引:主码那一个是白送的,另一个是自己想清楚才加的。

记牢它背下来

  1. 主码一定建
  2. 外码和常查的建
  3. 改得多的不建
  4. 取值少的不建

想一想

索引多一个,写入慢多少?

保山学院·人工智能教研室·曹鼎鼎