索引:索引是一个排序的列表,列表当中存储的是索引的值和包含这个值的数据所在行的物理地址
索引作用 加快查询速度
索引的作用
1、利用索引数据库可以快速定位,大大加快查询速度,主要作用
2、表的数据很多,查询需要关联多个表,这个时候索引也可以提高查询速度
3、加快表与表之间的连接速度
4、使用分组和排序时,可以大大减少时间
5、提高数据恢复数据时的速度
索引创建的原则
1、有索引,数据会先进行索引查询然后定位数据,索引使用不当,反而会增加数据库的负担
主键,外键必须有索引(创建好主键和外键自动就是索引,不需要额外声明)
一个表超过了300行纪录,必须要有索引,否则数据库会遍历标的所有数据
互相之间有关联得表,在这个关联字段应该设置索引
唯一性太差的字段,不适合创建索引
更新太频繁的字段,不适合做索引
经常被where条件匹配的字段,尤其是表数据比较多的,应该创建索引
在经常进行group by(分组) order by(排序) 的字段要建立索引
索引的字段字段越小越好,长文本的字段,不适合建立索引
如何查看表的索引
show index from 表名;
常用类型
B-树索引 BTREE
树形结构的索引,也是大部分数据库的默认索引类型
根节点:树的最顶端的分支节点
分支节点:指向索引里其他的分支节点,也可以是叶子节点
叶子节点:直接指向表里的数据行
哈希索引
散列索引 把任意长度的输入,通过散列算法变换车工固定长度的输出,散列值----分别对应数据里的列和行
mysql的默认引擎:innodb 默认的索引类型经济师Btree
MEMORY 引擎可以支持hash,也就是它的默认索引
先算散列值,然后在对应,速度比较慢,比Btree慢
hash的索引匹配:=in() <=>
创建索引
普通索引
创建表的时候,添加索引
create table xiaobu (
id int(4) PRIMARY KEY,
name VARCHAR(10),
card_id int(18),
phone int(11),
index name_index (name)
);
修改索引
alter table 表名 add index cradid_index (card_id);
唯一索引
唯一索引:unique 与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许控制 添加唯一键才会创建唯一键,最好是不要为空,unique not null
创建唯一索引
create unique index phone_index on 表名 (phnoe);
添加列
alter table 表名 add column address varchar(20) not null;
修改索引
alter table 表名 add unique address_index (address);
在创建时,添加唯一索引
create table xiaobu2 (
id int(4) PRIMARY KEY,
name VARCHAR(10),
card_id int(18) not null,
phone int(11) not null,
unique cardid_index (card_id),
unique phone_index(phone)
);
能在建表时创建好的条件,尽量在创建把条件约束好,不要创完之后再添加
清空引擎
alter table table1 engine=memory;
删除主键
alter table table1 drop primary key;
创建索引
create index name_index on 表名 (name);
创建索引
create index idx_hash_column on 表名 (sex) using hash;
主键索引:创建表的指定的主键就是索引,添加主键自动就是主键索引
主键:值唯一 一个表只能有一个主键 不允许有空值 创建主键,自动主键索引
全文索引 适合在进行模糊查询的时候使用,可以在一篇文章中检索文本信息
text
create table xiaobu3 (
id int(4) PRIMARY KEY,
name VARCHAR(10),
card_id int(18) not null,
phone int(11) not null,
notes text,
unique cardid_index (card_id),
unique phone_index(phone)
);
create fulltext index notes_index on 表名 (notes);
建表时创建
create table xiaobu4 (
id int(4) PRIMARY KEY,
name VARCHAR(10),
card_id int(18) not null,
phone int(11) not null,
notes text,
unique cardid_index (card_id),
unique phone_index(phone),
fulltext notes_index (notes)
);
删除索引
drop index notes_index on 表名;
模糊查询
select * from 表名 where 列名 like '%..' ;
查看当前语句是否使用索引
explain select * from 表名 where 列名 like '%..' ;
联合索引
指定一个索引名,一个索引名对应多个列名
create table xiaobu5 (
id int(4) PRIMARY KEY,
name VARCHAR(10),
card_id int(18) not null,
phone int(11) not null,
notes text,
fulltext notes_index (notes)
);
创建联合索引
create index index_union on xiaobu5 (card_id,phone);
show index from xiaobu5;
drop index notes_index on xiaobu5;
联合索引,查询时必须按照创建时的顺序来进行查询
create table xiaobu6 (
id int(4) PRIMARY KEY,
name VARCHAR(10),
card_id int(18) not null,
phone int(11) not null,
unique index carid_index (name,card_id,phone)
);
show index from xiaobu6;
explain select * from 表名 where 列名1 and 列名2;
mysql机制:默认会找最短的索引列,最优索引选择
联合索引,从左到右侧开始,不能跳过索引,否则索引会失效
范围查询,有可能右侧索引会失效 explain select * from 表名 where 列名1 > and 列名2; explain select * from 表名 where name = 123 ; 如果索引是字符串,但是不加引号,索引也会失效 explain select * from 表名 where name = 123 or phone = '123'; 使用or语句索引一定失效,使用or作为条件,mysql无法同时使用多个索引
is NULL is not null 有时候索引会失效 where is null 数据的绝大多数都是空值,索引失效 where is not null 数据多数为不null ,索引失效 索引:普通索引 主键索引 唯一索引 全文索引 联合索引 创建索引时,注意索引失效的情况 explain 加在查询语句前面,可以查看索引的使用情况
习题
创建表
vip_member
会员编号int
会员姓名varchar(10)
会员身份证号码 int(18)
会员电话int(11)
会员地址 varchar(50)
会员备注信息 text
1、先创建表
2、根据你的选择,来给这张表创建索引
3、每个列都要创建索引,然后执行查看索引的使用情况
主键索引
唯一索引
联合索引
全文索引
事务是一个机制,一个操作序列,包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行
不可分割的单位
事务的特点ACID
A:原子性 最小单位,事务里的所有条件都是一个整体,不可分割,要么都成功,要么都失败
C:一致性 事务开始之前和事务结束之后,数据库的完整性约束没有被破坏
事务完成时,数据必须属于一致状态
事务开始前,数据库中的存储数据处于一致状态
进行中的事务,数据可能处于不一致的状态
在事务最终完成时,必须再次回到已知的一致状态
I:隔离性 只在并发环境中,当不同事务同时操纵相同的数据时,每个事物都有各自的完整数据空间
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的
修改数据的事务可以另一个使用形同数据的事务开始之间访问这些数据,或者在另一个使用相同的事务结束之后访问这些数据
D:
mysql支持四种隔离级别
1、未提交读,允许脏读,允许一个事物可以看到其他食物未提交的修改
2、提交读,事务只能查看已经提交的修改,未提交的修改是不可见的,防止脏读orcale sql sever
3、可重复读,也是mysql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事务是否提交修改,可以防止脏读以及不可重复读
4、串行读,锁表,完全串行化,每一个事务都隔离,读写都阻塞,会降低数据库的效率
脏读:另外一个事务能够看到另一个事务未提交的修改结果
事务隔离级别的作用范围
1、全局级,对所有的会话有效
2、会话级,只对当前会话有效
查询全局事务的隔离级别
show global variables like '%isolation';
select @@global.tx_isolation;
会话事务的隔离级别
show session variables like '%isolation';
select @@session.tx_isolation;
脏读模拟
修改全局
set global transaction isolation level read uncommitted;
重启服务失效
set @@global.tx_isolation='read uncommitted';
修改会话
set session transaction isolation level read uncommitted;
重启服务失效
set @@session.tx_isolation='read uncommitted';
并且在终端也要修改全局和会话修改
创建一个表
create table xiaobu (
id int(4),
money varchar(20)
);
begin;
update 表名 set money=money-200 where id = 2;
不可重复读 一个事务内,多次读同一数据
前一个事务还没有结束,另一个事务也访问该数据
在一事务之内,两次查询到结果不一致,读不到相同的数据内容
修改全局
set global transaction isolation level read committed;
修改会话
set session transaction isolation level read committed;
flush privileges;
begin;
update 表名 set money=money-200 where id = 2;
select * from 表名;
commit;
幻读:一个事务对一个表中的数据进行修改,可能会涉及到表中的全部数据
另个一个事务也修改了表中的数据,插入了一行新的数据,前一个事务会发现表中还没有修改,类似于幻觉
终端开启
begin;
丢失更新:两个事务同时修改一条记录,A先也记录,B也修改了记录,b一旦提交,数据不会变化,最后要以最后提交的结果为主
以上这些情况如何避免
1、权限控制
2、根据情况来使用隔离级别
生产环境--最好是提交读和可重复读(根据需求)
测试环境--无所谓
3、生产环境只能允许一个人对一个事务进行操作,其他人不允许操作