数据库管理
- MySQL工具
- MySQL控制台客户端
- 数据库管理
- 一、创建数据库
- 二、选择数据库
- 三、查看数据库
- 四、修改数据库
- 五、删除数据库
- 字段类型
- MySQL支持多种数据类型,包括数值、日期/时间和字符串(字符)类型
- 数值类型包括整数类型和小数类型,其中:
- 日期/时间类型包括:
- 字符串类型包括:
- 一、数值类型
- 二、字符串类型
- 三、时间类型
- (1)YEAR类型
- (2)TIME类型
- (3)DATE类型
- (4)DATETIME类型
- (5)TIMESTAMP类型
- 数据表操作
- 一、创建数据表
- (1)使用主键约束
- (2)使用外键约束
- (3)使用非空约束
- (4)使用唯一约束
- (5)使用默认约束
- (6)使用自增属性
- 二、查看数据表
- 三、修改数据表
- (1)修改表名
- (2)修改表的字段类型
- (3)修改表的字段名字
- (4)为表添加字段
- (5)为表删除字段
- (6)调整表字段的位置
- (7)调整表的引擎
- (8)删除表的外键约束
- 四、删除数据表
- 数据库语句
- 一、新增数据
- 二、查询数据
- 三、修改数据
- 四、删除数据
- 五、replace操作
- 数据表字符集
- 一、查看字符集
- (1)查看MySQL服务器支持的字符集
- (2)查看字符集的校验规则
- (3)查看当前数据库的字符集
- (4)查看当前数据库的校验规则
- 二、设置字符集
- (1)为数据库指定字符集
- (2)为数据库指定校验规则
- (3)为表分配字符集
- (4)为表指定校验规则
- (5)为列分配字符集
- (6)为列分配校验规则
- 三、处理乱码
- 数据库索引
- 一、索引介绍
- 二、唯一索引
- 三、普通索引
- 四、删除索引
MySQL工具
MySQL控制台客户端
通过命令行登录MySQL的命令为:
mysql -u用户名 -p密码 -h ip地址 -P端口号
登录成功,MySQL控制台显示如下:
数据库管理
一、创建数据库
MySQL创建数据库的语法如下:
CREATE {DATABASE | SCHEMA}[IF NOT EXISTS]db_name;
- IF NOT EXISTS 的意思是如果不存在db_name库则创建该库,如果存在则当前命令会被忽略
- 如果MySQL已经有了一个库,然后用户再次执行创建命令,MySQL会返回数据库创建失败的错误。而如果指定IF NOT EXISTS,MySQL只会返回一个警告,执行语句不会报错
create database test;
运行结果如下:
此时如果再次运行创建test库的语句则会报错:
而如果加上if not exists
选项,创建命令会正常执行,MySQL会返回一个警告(warning信息
),可通过show warning
语句查看警告信息
- 创建数据库,并指定字符集为UTF-8
- 可用alter命令来调整库的字符集(后面会写到)
create database test DEFAULT CHARACTER SET utf8;
二、选择数据库
- 数据库创建完成后,如果想要在创建的数据库下进行操作,需要先切换到该库下,切换库的语法如下:
USE db_name;
- 切换到test库下,执行一个简单的查询语句
show tables
(查看当前库下有哪些表),由于test库下还没有表,所以会返回空
- 可以切换到MySQL库下,查看MySQL库下的表:
三、查看数据库
- 通过命令
show create database db_name;
可以查看库的创建方法,包括库的字符集信息:Tips:如果在创建库的时候没有指定字符集,系统会自动加上参数“DEFAULT CHARACTER SET utf8”,这个字符集可以自行设定,有兴趣的朋友可以自行查阅相关知识,这里不再多说
- 通过命令
show databases;
可以查看当前数据库中有哪些库
四、修改数据库
- 修改数据库的字符集可以通过命令
alter
来实现
alter database db_name DEFAULT CHARACTER SET utf8
//utf8 等字符集都可选
- 在这里我将字符集从utf8改为latin1
五、删除数据库
删除数据库是指将已经创建的库从数据库中删除,执行该操作会同时清除该库下的所有内容,包括表结构与数据等
Drop database db_name;
- db_name为要删除的库名,若不存在则执行删除命令会报错
- 这里删除刚刚创建的test库,执行命令如下:
- 执行查询命令,可以看出test库已经不存在了
删除库是一项危险操作,建议用户在确认库里的东西已经不需要了之后再执行删除操作,否则后果不堪设想
字段类型
MySQL支持多种数据类型,包括数值、日期/时间和字符串(字符)类型
数值类型包括整数类型和小数类型,其中:
- 整数类型包括
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
- 浮点数类型包括
FLOAT、DOUBLE
- 定点数类型包括
DECIMAL
日期/时间类型包括:
DATE、TIME、DATETIME、TIMESTAMP、YEAR
字符串类型包括:
CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET
- 其中
BINARY
和VAEBINARY
是二进制字符串类型
一、数值类型
- MySQL提供了多种整数类型,从
TINYINT
和BIGINT
,可以存储数据的范围越来越大,同时所需要的存储空间也越来越大,整数类型可以添加自增属性。 - 整数类型分为有符号数和无符号数,可以在数据类型后添加
UNSIGNED
关键字来标识该类型是有符号的还是无符号的。 INT
表示有符号的4字节长度的整数,而INT UNSIGNED
标识该类型是无符号的4字节长度整数- 有符号与无符号的取值范围是不同的:
- 浮点数类型包括单精度浮点数
[float(M,D)]
和双精度浮点数[double(M,D)]
- 定点数类型为
decimal(M,D)
型 decimal
型的取值范围与double相同,但是decimal
的有效范围由M和D决定,而且decimal
型的字节数是M+2.即定点数的存储空间由其精度决定- MySQL中可以指定浮点数和定点数的精度:其定义格式如下:
数据类型(M,D)
- “数据类型”指的是浮点数或定点数的数据类型名称
- M 参数称为精度,是数据的总长度,小数点不占位置
- D 参数称为标度,是小数点后面的长度
- 例如:float(6,2)表示数据为float型,数据长度为6,小数点后保留2位
注意:上述方法适用于浮点数和定点数,但不是浮点数的标准用法。建议在定义浮点数时,如果不是实际情况需要,最好不要使用。如果使用了,可能会影响数据库的迁移”
- 对于定点数而言,
decimal(M,D)
是定点数的标准格式,一般情况下可以选择这种数据类型 - 如果插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理,使其精度达到要求
二、字符串类型
- 字符串类型指
CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET
CHAR
与VARCHAR
类型相似,但它们之间保存和检索的方式有所区别,在最大长度和尾部空格是否被保留等方面有不同。在存储和检索过程中不进行大小写转换BINARY
和VARBINARY
类似于CHAR
和VARCHAR
,不同的是它们只包含二进制字符串,即它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序基于列值字节的数值TEXT
类型有4种:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
,它们分别对应4种BLOB
类型,有相同的最大长度和存储需求ENUM
是枚举类型SET
是集合类型,不同于ENUM
类型,它是一个排列组合,假如有abc,它可以选择a或b或c,也可选择ab或ac或bc或abc
三、时间类型
- 表示时间值的日期和时间类型为
YEAR、TIME、DATE、DATETIME、TIMESTAMP
YEAR
,字节数为1,取值范围为“1901~2155”TIME
,字节数为3,取值范围为“-838:59:59~838:59:59”DATE
,字节数为4,取值范围为“1001-0101~9999-12-31”DATETIME
,字节数为8,取值范围为“1000-01-01 00:00:00~9999-12-31 23:59:59”TIMESTAMP
,字节数为4,取值范围为“19700101080001~20380119111407”- 如果插入值超出有效取值范围,系统会报错,并将零值插入到数据库中
(1)YEAR类型
- 给YEAR类型赋值可以有三种方法:
1、直接插入4位字符串或4位数字
2、插入2位字符串
,这种情况下如果插入‘00’-‘69’,相当于插入‘2000’-‘2069’如果插入‘70’-‘99’,相当于插入‘1970’-‘1999’,插入’0’也是‘2000’3、插入2位数字
,它与第二种方法不同的是,如果插入0,则表示‘0000’,所以在给YEAR类型赋值时一定要注意0和‘0’,二者只相差一个引号,却相差了2000年
(2)TIME类型
- TIME类型表示为
时:分:秒
,尽管小时范围为0~23,但是为了表示某些特殊时间间隔,MySQL将TIME的小时范围扩大了,而且支持负值 - 对TIME类型赋值,标准格式是
HH:MM:SS
,但不一定非要是这种格式。如果插入的是D HH:MM:SS
,格式,则相当于插入了D*(24+HH):MM:SS
;如果插入的是HH:MM或SS
格式,则其他未被表示位的值被赋值为零值;另外也有D HH
和D HH:MM
等格式 - 在MySQL中,对于
HHMMSS
格式,系统能自动转换为标准格式 - 插入当前时间:
NOW()
或CURRENT_TIME()
- TIME类型只占3个字节,如果只是存储时间数据,它是最好最合适的选择
(3)DATE类型
- 标准格式为:
YYYY-MM-DD
- 另外,MySQL还支持一些不严格的语法格式,分隔符
-
可以被@ .
等众多符号来替代 - 也可以使用
YY-MM-DD
来插入数据,YY转换为年份的规则与YEAR类型类似 - 插入当前系统时间:
NOW()
或CURRENT_DATE()
(4)DATETIME类型
- 标准格式为:
YYYY-MM-DD HH:MM:SS
- 具体赋值方法与上述各种类型的方法类似
(5)TIMESTAMP类型
- TIMESTAMP类型的取值范围比较小,因此在输入值的时候一定要保证在TIMESTAMP的取值范围之内
- 它的插入与插入其他日期和时间类型类似
- 插入当前系统时间:1、
CURRENT_TIMESTAMP()
2、输入NULL
,系统自动输入当前的TIMESTAMP 3、无任何输入,系统自动输入当前的TIMESTAMP - TIMESTAMP的数值是与时区相关的
数据表操作
- 在数据库中,表是存储数据的基本单位,也是数据库中最重要的操作对象和面向用户的基本接口
- 每张表会有若干列,每一行代表一条数据记录
- 在MySQL中,数据是按行存储的
一、创建数据表
- 创建表的基本语法如下:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(
列名1 数据类型 [约束条件] [默认值],
列名2 数据类型 [约束条件] [默认值],
列名3 数据类型 [约束条件] [默认值],
...
列名n 数据类型 [约束条件] [默认值]
)[表的约束条件];
-- 最后一个不可以有逗号否则会报错
- comment 可用于增加字段说明
如:name varchar(20) comment '姓名';
(1)使用主键约束
- 主键由表的一列或多列组合而成
- 主键约束要求主键列数据唯一且不为空
- 主键可以标识表的唯一一条记录,表的主键相当于表的目录
- 当为表创建主键后,使用主键列作为查询条件可以大大加快表的查询速度
- 主键可以由多个字段构成,语法如下:
PRIMARY KEY(列名1,列名2,...,列名n)
- 创建用户表user_tmp3,指定id列与name列为联合主键,建表语法如下:
CREATE TABLE user_tmp3
(
id int(11),
name varchar(128),
age int(11),
PRIMARY KEY(id,name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)使用外键约束
- 创建外键约束的语法如下:
[CONSTRAINT <外键名>]FOREIGN KEY (列名1,...)
REFERENCES <父表名>(主键列名1,...)
- 外键名是定义的外键约束的名字,一个表中的不同约束的名字不能相同
(列名1,...)
表示要添加外键约束的列 - 父表名表示外键约束中子表依赖的父表的表名,
主键列名1,...
表示父表中定义的主键列 - 创建外键约束父表和子表示例如下,其中father表为父表,son表为子表:
CREATE TABLE father
(
id int primary key,
name varchar(100)
);
- 创建父表:
- 创建子表并使用外键约束:
CREATE TABLE son
(
id int primary key,
name varchar(100),
age int,
c_id int,
constraint p_c_id foreign key(c_id) REFERENCES father(id)
);
(3)使用非空约束
- 非空约束是指列的值不能为空
- 对于使用了非空约束的字段,如果用户在插入数据时没有指定值,数据库会报错
- 非空约束的语法规则如下:
列名 数据类型 not null
- 创建表user_tmp4,并指定用户姓名不能为空,建表语句如下:
CREATE TABLE user_tmp4
(
id int,
name varchar(20) NOT NULL
);
(4)使用唯一约束
- 表的唯一约束是指列的值唯一,但是可以为空
- 对于使用了唯一约束的字段,数据库可以保证这些字段的值不会重复
- 唯一约束的语法如下所示,在顶一万列类型后直接加UNIQUE关键字:
列名 数据类型 UNIQUE
- 创建用户表user_tmp5,指定id列唯一
CREATE TABLE user_tmp5
(
id int UNIQUE,
name VARCHAR(100)
);
(5)使用默认约束
- 默认约束的作用是为某列指定默认值
- 在向表中插入数据时,如果不指定该列的值,那么会使用默认值来填充该列:
- 默认约束的语法规则如下:
字段名 数据类型 DEFAULT 默认值
- 定义数据表user_tmp6,对于name列指定默认值为“newUser”
CREATE TABLE user_tmp6
(
id int,
name VARCHAR(100) DEFAULT "newUser"
);
- 在向user_tmp6表中插入数据时,如果不指定name列的值,那么会自动将 “newUser” 作为该列的值
INSERT INTO user_tmp6 set id = 1
INSERT INTO user_tmp6 set id = 2
SELECT * FROM user_tmp6;
--一步一步执行
- 可以看到新插入的两个数据name都被默认值赋值为 "newUser"
(6)使用自增属性
- 为列添加自增属性语法如下:
列名 数据类型 AUTO_INCREMENT
- 创建用户表user_tmp7,设置id为自增列:
CREATE TABLE user_tmp7
(
id int PRIMARY Key auto_increment,
name varchar(100)
);
二、查看数据表
- 查看当前创建的表:
SHOW TABLES;
- 查看表结构:
show create table 表名;
SHOW CREATE TABLE user_tmp7;
- 只查看表中各个列的定义:
desc 表名;
DESC user_tmp7;
Tips:id为主键所以数据唯一且不能为空,创建时赋予了自增属性
三、修改数据表
(1)修改表名
- 修改表名只会修改表的名字,对表的数据、字段的类型都没有影响,修改表名有两种语法形式:
--1、使用ALTER命令
ALTER TABLE 原表名 RENAME [TO] 新表名;
--2、使用RENAME命令
RENAME TABLE 原表名 TO 新表名;
- 使用ALTER修改user_tmp7为user_temp7
ALTER TABLE user_tmp7 RENAME user_temp7;
- 使用RENAME修改user_temp7为user_tmp7:
RENAME TABLE user_temp7 to user_tmp7;
(2)修改表的字段类型
- 修改表的字段类型的语法如下:
ALTER TABLE 表名 MODIFY 列名 数据类型;
- 执行alter命令修改name类型:
- 原表数据:
ALTER TABLE user_tmp7 MODIFY name VARCHAR(200);
- 修改后:
(3)修改表的字段名字
- 修改表的字段名字的语法如下:
ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型;
- 将user_tmp7的name字段修改为new_name:
ALTER TABLE user_tmp7 CHANGE name new_name VARCHAR(300);
(4)为表添加字段
- 为表添加字段的语法如下:
ALTER TABLE 表名 ADD 新列名 数据类型 [约束条件][FIRST|AFTER 字段名];
- 为表user_tmp7添加一个字段age,同时添加非空属性,默认值为0:
ALTER TABLE user_tmp7 ADD age int not NULL DEFAULT 0;
- first和after字段名表示在特定位置添加字段
(5)为表删除字段
- 删除表字段的语法如下:
ALTER TABLE 表名 DROP 列名;
- 删除user_tmp7中的age字段
ALTER TABLE user_tmp7 DROP age;
(6)调整表字段的位置
- 调整表的字段位置的语法如下:
ALTER TABLE 表名 MODIFY 列名 数据类型 FIRST | AFTER 字段名;
- 调整age为第一列:
ALTER TABLE user_tmp7 MODIFY age int first;
- 调整age在id后面:
ALTER TABLE user_tmp7 MODIFY age int AFTER id;
(7)调整表的引擎
- 修改表的存储引擎的语法如下:
ALTER TABLE 表名 ENGINE=新引擎名;
-- 查看当前数据库支持哪些引擎
SHOW ENGINES;
(8)删除表的外键约束
- 删除表的外键约束语法如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
- 删除son表的外键:
ALTER TABLE son DROP FOREIGN KEY p_c_id;
四、删除数据表
- 删除数据表的语法如下:
DROP TABLE [IF EXISTS] 表1,表2,...,表n;
- 删除多张表:
DROP TABLE user_tmp4,user_tmp5,user_tmp6;
数据库语句
一、新增数据
- MySQL中使用
INSERT INTO
SQL语句来插入数据 - 语法如下:
INSERT table_name (field1,field2,...,fieldn)
VALUES
(value1,value2,...,valuen);
- 如果数据是字符型,则必须使用单引号或双引号,如
'value
或"value
- 插入两条数据:
INSERT INTO test1(name,age,phone_num)
VALUES("张三",21,12345678900),
("李四",20,10987654321);
二、查询数据
- MySQL数据库中使用SQL
SELECT
语句来查询数据 - 语法如下:
SELECT column_name,colmu_name
FROM table_name
[WHERE Clause]
[LIMIT N][OFFSET M];
- 查询test1表的数据:
SELECT * FROM test1;
- 查询年龄大于等于20岁的用户(指定查看name和age列):
select name,age from test1 WHERE age >= 20;
- 查询用到的操作符:
select * FROM test1 WHERE name LIKE "张%";
select * FROM test1 WHERE name LIKE "张_";
select * From test1 WHERE age BETWEEN 21 AND 30;
-- 分页查询:LIMIT(MySQL专用)
-- 从0开始,筛选n条数据
select ... FROM 表名 [WHERE] [ORDER BY...] LIMIT n;
-- 从s开始,筛选n条数据
select ... FROM 表名 [WHERE] [ORDER BY...] LIMIT s,n;
select ... FROM 表名 [WHERE] [ORDER BY...] LIMIT n OFFSET s;
select * FROM test1 LIMIT 1;
select * FROM test1 LIMIT 1,3;
select * FROM test1 LIMIT 3 OFFSET 1;
三、修改数据
- MySQL中使用SQL语句
UPDATE
命令来修改数据: - 语法如下:
UPDATE table_name SET field1=new-value1,field2=new-value2
[WHERE Clause];
- 将id为1的用户年龄更新为22岁:
UPDATE test1 set age = 22 WHERE id = 1;
- 将id为3或4的用户电话号码更新:
UPDATE test1 set phone_num = 33333333333
WHERE id = 3 OR id = 4;
四、删除数据
- MySQL中使用SQL语句
DELETE FROM
命令来删除数据: - 语法如下:
DELETE FROM table_name [WHERE Clause];
- 删除年龄在20岁以下的用户:
DELETE FROM test1 WHERE age < 20;
五、replace操作
- replace的作用是如果数据库中存在相同的主键数据,则相当于修改操作;如果数据库中不存在相同的主键数据,则相当于插入操作:
- 语法如下:
REPLACE [INTO] table_name [(col_name...)]
{VALUES | VALUE}({expr | DEFAULT},...),(...),... ;
- 查看当前test1表里的数据,然后执行replace语句,之后再次执行查询语句,可以发现,id为1的用户存在,则发生修改操作,id为3的信息与replace语句内容一样,则不修改,id为5的用户不存在,则执行插入:
SELECT * FROM test1;
REPLACE into test1 (id,name,age,phone_num)VALUES
(1,"小红",20,99999999999),
(3,"张三",21,33333333333),
(5,"王五",22,44444444444);
SELECT * FROM test1;
数据表字符集
- 字符集是一套符号和编码。校验规则(collation)是在字符内用于比较字符的一套规则,即字符集的排序规则。MySQL可以使用对应字符集和校验规则来组织字符
- MySQL服务器支持多种字符集,在同一服务器、同一个数据库,针织同一个表的不同字段都可以指定使用不同的字符集
- Oracle等其他数据库在同一个数据库中只允许使用相同的字符集,相比较之下MySQL明显具有更好的灵活性
- 每种字符集可能会有多种字符校验规则,也都有一个默认的校验规则,并且每个校验规则只是针对某个字符集,和其他的字符集没有关系
- 在MySQL中,字符集的概念和编码方案被看做是同义词,一个字符集是一个转换表和一个编码方案的组合
一、查看字符集
(1)查看MySQL服务器支持的字符集
SHOW CHARACTER SET;
- Charset——字符集、Description——描述、Default collation——默认排序、Maxlen——最大长度
(2)查看字符集的校验规则
SHOW COLLATION;
(3)查看当前数据库的字符集
SHOW VARIABLES LIKE 'character%';
- character_set_client:客户端请求数据的字符集
- character_set_connection:客户机/服务器连接的字符集
- character_set_database:默认数据库的字符集,无论默认数据库如何改变们都是这个字符集;如果没有默认数据库,那就使用character_set_server指定的字符集,这个变量建议由系统自己管理,不要认为定义
- character_set_filesystem:把os上文件名转换为此字符集,即把character_set_client转换为character_set_filesystem,默认binary是不做任何转换的
- character_set_results:结果集,返回给客户端的字符局
- character_set_server:数据库服务器的默认字符集
- character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字
(4)查看当前数据库的校验规则
SHOW VARIABLES LIKE 'collation%';
- collation_connection:当前连接的字符集
- collation_database:当前日期的默认校验。每次用USE语句来跳转到另一个数据库的时候,这个变量的值就会改变。如果没有当前数据库,这个变量的值就是collation_server变量的值
- collation_server:服务器的默认校验
二、设置字符集
(1)为数据库指定字符集
- 创建的每个数据库都有一个默认字符集,如果没有指定,则使用LATIN1
CREATE datebase db_name charset=utf8;
(2)为数据库指定校验规则
CREATE DATEBASE db_name default charset utf8 collate utf8_romanian_ci;
(3)为表分配字符集
create table table_charset
(
c1 varchar(10),
c2 varchar(10)
)engine=innodb default charset=utf8;
(4)为表指定校验规则
create table table_collate
(
c1 varchar(10),
c2 varchar(10)
)engine=innodb default charset=utf8 collate utf8_romanian_ci;
(5)为列分配字符集
CREATE table column_charset
(
c1 char(10) character set utf8 not null,
c2 char(10) char set utf8,
c3 varchar(10) charset utf8,
c4 varchar(10)
)engine=innodb;
(6)为列分配校验规则
CREATE table column_collate
(
c1 char(10) character utf8 collate utf8_romanian_ci not null,
c2 char(10) character utf8 collate utf8_spanish_ci
)engine=innodb;
三、处理乱码
- 首先要明确你的客户段使用何种编码格式,这是最重要的(IE6一般用UTF8,命令行一般是GBK,一般程序是GB2312)
- 确保你的数据库使用UTF-8格式,很简单,所有编码通吃
- 一定要保证connection字符集大于等于client字符集,不然信息就会丢失。比如:LATIN1 < GB2312 < GBK < UTF-8,若设置character_set_client = GB2312,那么至少connection的字符集要大于等于GB2312,否则就会丢失信息
- 以上三步都正确的话,那么所有中文都会被正确的转换成UTF-8格式存储进数据库
- 为了适应不同的浏览器和客户端,可以修改character_set_results来以不同的编码显示中文字体。由于UTF-8是大方向,所以还是建议在Web应用中使用UTF-8格式显示中文
数据库索引
一、索引介绍
- MySQL索引的建立是提升MySQL运行效率非常重要的手段,可以大大提高MySQL的检索速度
- 创建索引时,需要确保该索引应用的是SQL查询语句的条件(一般作为WHERE子句的条件)
- 索引分为单列索引和组合索引。单列索引即一个索引只包含单个列,一个表可以有多个单列索引;组合索引即一个索引包含多个列
- 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录
- 缺点:过多的使用索引Juin造成滥用,它在提高查询速度的同时也降低了表的更新速度
- 在对表进行INSERT、UPDATE和DELETE操作时,因为更新表时MySQL不仅要保存数据,还要保存索引文件,所以更新速度会变慢。建立索引还会占用磁盘空间的索引文件
二、唯一索引
- 唯一索引与普通列表索引类似,不同的是唯一索引的列值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
- 创建方式如下:
- 直接创建索引:
CREATE UNIQUE INDEX indexNmae ON mytable(username(length));
- 通过修改表结构增加索引:
ALTER TABLE MYTABLE add unique[indexName](username(length));
- 创建表的时候直接指定:
CREATE TABLE mytable
(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName](username(length))
);
三、普通索引
- 直接创建索引:
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR、VARCHAR类型,length可以小于字段的实际长度;如果是BLOB和TEXT类型,必须指定length
- 修改表结构(添加索引):
ALTER table tableName ADD INDEX
indexName(columnName);
- 创建表的时候直接指定:
CREATE TABLE mttable
(
IN INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName](username(length))
);
四、删除索引
DROP INDEX [indexName] ON mytable;