@R星校长
索引是一张特殊的表,该表保存了主键与索引字段,并指向实体表的记录。
先假设有一张表student,表的数据有100万条数据,其中有一条数据是 name="xiaoming",如果要拿这条数据的话需要写的sql是
select * from student where name='xiaoming'一般情况下,在没有建立索引的时候,MySQL 需要扫描全表及扫描100万条数据找这条数据,这个效率实际上是非常慢的,那么有什么优化方法呢?答案就是索引。
如果我在name字段上建立索引,那么 MySQL只需要扫描一行数据及为我们找到这条name='xiaoming'的数据,是不是感觉性能提升了好多咧….
单列索引分类和创建
我们使用最常见的是单列索引,分为主键索引、普通索引和唯一索引。
1.主键索引
主键索引一般在建表时创建,不允许有空值并且值唯一,最好是与表的其他字段不相关的列或者是业务不相关的列。一般会设为 int而且是 AUTO_INCREMENT自增类型的,例如一般表的 id字段。
创建主键索引一般建表时使用primary关键字,例如如下语句:
CREATE TABLE `student` ( `ID` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;2.普通索引
普通索引实际上是我们最常见的,比如上述提到的例子,我们给name增加一个普通索引如下:
CREATE INDEX name_index ON `student`(`name`);注意这里的 ` 不是单引号,而是键盘 1 数字左边的符;
或者是:
ALTER TABLE student ADD INDEX name_index(`name`);3.唯一索引
唯一索引和主键索引类似,要求字段唯一,但是可以允许字段为空,创建语句如下:
CREATE UNIQUE INDEX name_index ON `student`(`name`);唯一索引可以用来对数据进行强制性要求,可以禁止某表的某个字段出现重复数据。
编程要求
根据提示,在右侧编辑器创建如下student表结构,并创建id为主键索引,name为唯一索引(索引名name_index),score为普通索引(索引名score_index)。
student结构如下:
字段名类型、属性idint(11) ,非空,自增长namevarchar(20) , 非空scoreint(10)预期输出:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment student 0 PRIMARY 1 id A 0 NULL NULL BTREE student 0 name_index 1 name A 0 NULL NULL BTREE student 1 score_index 1 score A 0 NULL NULL YES BTREE开始你的任务吧,祝你成功!
USE Students; #请在此处添加实现代码 ########## Begin ########## #1.创建student表结构并且设置id为主键索引 create table student( id int(11) NOT NUll AUTO_INCREMENT, primary key (`id`), name varchar(20) NOT NULL, score int(10) ); #2.对name建立唯一索引 CREATE UNIQUE INDEX name_index ON `student`(`name`); #3.对score建立普通索引 ALTER TABLE student ADD INDEX score_index(`score`); SHOW INDEX FROM student; ########## End ########## #! /bin/bash mysql -uroot -p123123 << EDF drop database if exists Students; CREATE DATABASE Students; USE Students; EDF #执行sql文件 mysql -uroot -p123123 < src/step2/step2.sql