索引是一个列表 —— 若干列集合和这些值的记录在数据表存储位置的物理地址
作用
一般建立原则
MySQL中 InnoDB存储引擎支持索引
name | use |
---|---|
普通索引 INDEX | 值可空,没有唯一性限制 |
唯一值索引 UNIQUE | 值可空,但唯一 |
主键索引 PRIMARY KEY | 一个表只能由一个PK, 系统自动创建 |
全文索引 FULLTEXT | 在 varchar、char、text 类型的列上创建,便于查询字符串类型 |
物理存储区分:
CREATE INDEX
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名[索引类型]
on 表名(索引列名)
[索引选项]
索引列名 =:
列名[(长度)][ASC|DESC]
ALTER TABLE语句可以修改表定义,包括向表中添加索引
ALTER TABLE tbl_name ADD PRIMARY KEY | UNIQUE | INDEX | FULLTEXT (column_list)
删除
DROP INDEX 索引名 ON 表名
Alter TABLE 表名 ...
DROP PRIMARYKEY
| DROP {INDEX | KEY} 索引名
| DROP FOREIGN KEY 外键名
显示
SHOW INDEXES FROM tbl_name;
SHOW INDEXES FROM tbl_name IN db_name;
# *INDEX和KEY是INDEXES同义词
返回
name | use |
---|---|
table | 表的名称 |
NON_UNIQUE | 如果索引可以包含重复项,则为1;如果可以,则为0。 |
KEY_NAME | 索引的名称。主键索引始终具有PRIMARY名称。 |
seq_in_index | 索引中的列序列号。第一列序列号从1开始。 |
column_name | 列名称。 |
collation | 排序规则表示列在索引中的排序方式。A表示升序;B表示降序;NULL表示未分类。 |
cardinality | 基数返回索引中估计的唯一值数。请注意,基数越高 —— 查询优化器使用索引进行查找的可能性就越大。 |
sub_part | 索引前缀。如果对整个列编制索引,则为null。否则,它会显示部分索引列的索引字符数。 |
packed | 表示密钥是如何打包的。 |
null | YES——如果列可能包含NULL值,如果不包含空值则为空。 |
INDEX_TYPE | 表示使用诸如索引方法BTREE,HASH,RTREE,或FULLTEXT。 |
comment | 有关索引的信息未在其自己的列中描述 |
index_comment | 显示使用COMMENT属性创建索引时指定的索引的注释。 |
¤visible | 索引是否对查询优化器可见或不可见; YES 是,NO 不是。 |
expression | 如果索引使用表达式而不是列或列前缀值,则表达式指示键部分的表达式,并且column_name列也为NULL。 |
建议使用
不建议使用
失效
注意
最左匹配原则
name | use |
---|---|
¤ id | 选择标识符 |
¤ select_type | 表示查询的类型 |
¤ table | 输出结果集的表 |
¤ partitions | 匹配的分区 |
¤ type | 访问类型,常用的有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好) |
¤ possible_keys | 表示查询时,可能使用的索引,为NULL表示没有相关索引 |
¤ key | 表示实际使用的索引,如果为NULL表示没有选择索引 |
¤ key_len | 索引字段的长度,不损失精确性的情况下,长度越短越好 |
¤ ref | 列与索引的比较 |
¤ rows | 扫描出的行数(估算的行数) |
¤ filtered | 按表条件过滤的行百分比 |
¤ Extra | 执行情况的描述和说明 |
MySQL 4.1开始支持事务,事务由作为一个单独单元的一个或多个SQL语句组成。
当一个会话开始时,系统变量AUTOCOMMIT值为1,即自动提交功能是打开的
任意一条SQL语句发送到服务器时,MySQL服务器会立即解析、执行并将更新结果提交到数据库文件中
在执行事务时要首先关闭MySQL的自动提交,使用命令“set autocommit=0;”可以关闭MySQL的自动提交
注意
set autocommit=0;
insert into account values(111,500);
commit;
insert into account values(222,500);
create table student(
studentid char(6) primary key,
name varchar(10),
sex char(2)
)engine=innodb;
insert into account values(333,500);
select * from account;
在上面SQL语句执行过程中
销未提交的事务所做的各种修改操作,并结束当前这个事务
若只撤销一部分,可以用“部分回滚”
savepoint
保存点名;”可以在事务中设置一个保存点,使用“rollback to savepoint 保存点名;”可以将事务回滚到保存点状态ACID
ATOMICITY CONSISTENCY ISOLATION DURABILITY
从低到高分别是
read uncommitted(读取未提交的数据)
read committed(读取提交的数据)
repeatable read(可重复读)
serializable(串行化)。
解决多用户问题
用户对数据库并发访问时,为了确保事务完整性和数据库一致性,需要使用锁定 —— 防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据
高级别的事务隔离 —— 有效地实现并发,但会降低事务并发访问的性能
低级别的事务隔离可以提高事务的并发访问性能,但可能导致并发事务中的脏读、不可重复读和幻读等问题
三个问题:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | ✔ | ✔ | ✔ |
read committed | × | ✔ | ✔ |
repeatable read | × | × | ✔ |
serializable | × | × | × |
一个事务可以读到另一个事务未提交的数据
set session transaction isolation level read uncommitted
这个时候 A 读到了B未结束事务但已更新的结果(也就是加了 800)
同一个事务中,两条相同的查询语句其查询结果不一致
A读到的数据是B事务提交后的数据
当前事务读不到其他事务已经提交的修改(别人已经改了而且提交事务了,而你的读的内容还是修改之前的)
上一篇:mysql的复制和备份