一、索引
索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。
分类:
- 普通索引
- 唯一索引
- 全文索引
- 组合索引
- 主键索引
1、普通索引
普通索引仅有一个功能:加速查询
#创建表时创建索引 CREATE TABLE user ( id INT, username VARCHAR(30) , password VARCHAR(50), INDEX index_username (username)
);
注意:创建索引时如果是blob 和 text 类型,必须指定length。
2、唯一索引
唯一索引有两个功能:加速查询 和 唯一约束(可含null)
#创建表时创建唯一索引 CREATE TABLE user ( id INT, username VARCHAR(30) , password VARCHAR(50), UNIQUE index_username (username)
); #在存在的表上创建唯一索引 create unique index 索引名 on 表名(列名) #删除存在表上的索引 drop unique index 索引名 on 表名
3、全文索引
全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表;作用于CHAR、VARCHAR、TEXT数据类型的列。
#创建表时创建唯一索引 CREATE TABLE user ( id INT, username VARCHAR(30) , password VARCHAR(50), FULLTEXT index_username (username)
);
4、组合索引
将几个列作为一条索引进行检索,使用最左匹配原则,比如频繁的使用多列进行查询,where username='bright' and password='123456'
#创建组合索引 CREATE TABLE user ( id INT, username VARCHAR(30) , password VARCHAR(50), INDEX index_info (username, password) );
5、主键索引
主键有两个功能:加速查询 和 唯一约束(不可含null),当一张表把某个列设为主键的时候,则该列就是主键索引。
#创建主键索引 CREATE TABLE user ( nid int not null auto_increment primary key, #主键索引 username VARCHAR(30) , password VARCHAR(50), INDEX index_info (username, password) );
#创建主键
alter table 表名 add primary key(列名);
#删除主键
alter table 表名 drop primary key;
6、索引的添加与删除
(1)添加索引
#在已存在的表上创建索引 CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(长度)] [ASC |DESC]) ; #如: CREEATE INDEX index_name ON table_name(column_name)
(2)删除索引
#删除存在表上的索引 DROP INDEX 索引名 ON 表名 #如: drop index_name on table_name;
(3)查看索引
#查看存在表上的索引 SHOW INDEX FROM 表名 #如: show index from table_name;
二、事务
1、概念
事务是一个最小的不可再分的工作单元或者一组原子性的sql命令,一旦在执行命令过程中出现错误就会回滚到最初状态,从而保证数据的完整性。事务必须满足四个条件:
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
2、事务相关命令
--开启事务:Start Transaction --事务结束:End Transaction --提交事务:Commit Transaction --回滚事务:Rollback Transaction
3、实例
- 事务操作成功
mysql> start transaction; --开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into class(caption) values('四年一班'); Query OK, 1 row affected (0.00 sec) mysql> commit; --提交,数据库内部已经改变 Query OK, 0 rows affected (0.00 sec) mysql> select * from class; +-----+----------+ | cid | caption | +-----+----------+ | 1 | 三年二班 | | 2 | 一年三班 | | 3 | 三年一班 | | 5 | 四年一班 | +-----+----------+ 4 rows in set (0.00 sec)
- 事务操作失败
mysql> start transaction; --开启事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into class(caption) values('四年一班'); Query OK, 1 row affected (0.00 sec) mysql> select * from class; +-----+----------+ | cid | caption | +-----+----------+ | 1 | 三年二班 | | 2 | 一年三班 | | 3 | 三年一班 | | 4 | 四年一班 | +-----+----------+ 4 rows in set (0.00 sec) mysql> rollback; --回滚,事务操作失败 Query OK, 0 rows affected (0.00 sec) mysql> select * from class; +-----+----------+ | cid | caption | +-----+----------+ | 1 | 三年二班 | | 2 | 一年三班 | | 3 | 三年一班 | +-----+----------+ 3 rows in set (0.00 sec)
三、视图
视图可以理解为存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色(不是真实存在的)。
1、创建视图
#格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v AS SELECT * FROM userinfo;
2、删除视图
#格式:DROP VIEW 视图名称 DROP VIEW v
3、修改视图
格式:ALTER VIEW 视图名称 AS SQL语句 ALTER VIEW v AS SELET username,password FROM userinfo;
4、使用视图
由于视图是虚拟表,因此无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。
SELECT * FROM v;
四、存储过程
存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。
1、创建存储过程
mysql> delimiter $$ --将语句的结束符号从分号;临时改为两个$$(可以是自定义) mysql> create procedure p2() -> select * from usertabl -> end $$ Query OK, 0 rows affected (0.0) mysql> delimiter ; --#将语句的结束符号恢复为分号
2、执行存储过程
mysql> call p2();
3、删除存储过程
mysql> drop procedure p2;