思维导图
索引
索引特点
通过某一列的特征.给表添加一个索引列.索引列需要mysql来维护.也会消耗内存和cpu资源.
索引实现原理
通过算法来实现: 常见有hash算法和b_tree树来实现. 把列中的值通过hash计算出一个整数值.把整数值单独存储成为索引列.用于记录位置.避免全表扫描.
索引作用
提升查询的效率.
索引的分类
单索引: 普通索引 -- index 需要创建 唯一索引 -- 唯一约束自带索引 主键索引 -- 主键约束自带索引 组合索引: 两个或者多个列共同组成索引.[了解]
语法:
-- 方式1-创建表的时候直接指定
create table student(
sid int primary key,-- 主键自带索引
card_id varchar(20),
name varchar(20),
gender varchar(20),
age int,
birth date,
phone_num varchar(20),
score double,
index index_name(name) -- 给name列创建普通索引
);
-- todo 查询库中所有的索引
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'day12';
-- todo 创建表后添加索引.
-- 方式2-直接创建
-- create [unique] index indexname on tablename(columnname);
create index index_gender on student(gender);
-- 方式3-修改表结构(添加索引)
-- alter table tablename add [unique] index indexname(columnname)
alter table student add index index_age(age);
-- todo 删除和查看索引----------------------------------------------------------------
-- todo 查询库中所有的索引
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'day12';
-- 查看表中的索引
show index from student;
drop index index_age on student; -- 删除索引
alter table student drop index index_gender;-- 删除索引
-- todo 唯一索引----------------------------------------
-- 方式1-创建表的时候直接指定
create table student2(
sid int primary key,
card_id varchar(20),
name varchar(20) unique ,
gender varchar(20),
age int,
birth date,
phone_num varchar(20),
score double,
unique index_card_id(card_id) -- 给card_id列创建索引
);
-- 方式2-直接创建
-- create unique index 索引名 on 表名(列名)
create unique index index_card_id on student2(card_id);
-- 方式3-修改表结构(添加索引)
-- alter table 表名 add unique [索引名] (列名)
alter table student2 add unique index_phone_num(phone_num);
-- 主键索引无需创建--主键自带索引.
组合索引语法
-- 组合索引
use mydb5;
-- 创建索引的基本语法-- 普通索引
-- create index indexname on table_name(column1(length),column2(length));
create index index_phone_name on student(phone_num,name);
-- 操作-删除索引
drop index index_phone_name on student;
-- 创建索引的基本语法-- 唯一索引
create unique index index_phone_name on student(phone_num,name);
select * from student where name = '张三'; -- 无法命中索引--
select * from student where phone_num = '15100046637';
select * from student where phone_num = '15100046637' and name = '张三';
select * from student where name = '张三' and phone_num = '15100046637';
/*
三条sql只有 2、3、4能使用的到索引idx_phone_name,因为条件里面必须包含索引前面的字段 才能够进行匹配。
而3和4相比where条件的顺序不一样,为什么4可以用到索引呢?是因为mysql本身就有一层sql优化,他会根据sql来识别出来该用哪个索引,我们可以理解为3和4在mysql眼中是等价的。
*/
索引总结
索引的优点: 大大加快数据的查询速度 使用分组和排序进行数据查询时,可以显著减少查询时分组和排序的时间 创建唯一索引,能够保证数据库表中每一行数据的唯一性 在实现数据的参考完整性方面,可以加速表和表之间的连接 索引的缺点: 创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加 索引需要占据磁盘空间 对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度 创建索引的原则: 更新频繁的列不应设置索引 数据量小的表不要使用索引(毕竟总共2页的文档,还要目录吗?) 重复数据多的字段不应设为索引(比如性别,只有男和女,一般来说:重复的数据超过百分之15就不该建索引) 首先应该考虑对where 和 order by 涉及的列上建立索引
引擎
概念:
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。 用户可以根据不同的需求为数据表选择不同的存储引擎
常见引擎
MyISAM:Mysql 5.5之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务 InnoDB:事务型速记的首选引擎,支持ACID事务,支持行级锁定,MySQL5.5成为默认数据库引擎 Memory: 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在MYSQL重新启动是会丢失。 ------------------------------------------------------------------------ Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差 Federated :将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
代码操作
-- 查询当前数据库支持的存储引擎:
show engines;
-- 查看当前的默认存储引擎:
show variables like ‘%storage_engine%’;
-- 查看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
show create table student;
-- 创建新表时指定存储引擎:
create table(...) engine=MyISAM;
-- 修改数据库引擎
alter table student engine = INNODB;
alter table student engine = MyISAM;
-- 修改MySQL默认存储引擎方法 1. 关闭mysql服务 2. 找到mysql安装目录下的my.ini文件: 3. 找到default-storage-engine=INNODB 改为目标引擎, 如:default-storage-engine=MYISAM 4. 启动mysql服务
事务
在MySQL中的事务(Transaction)是由存储引擎实现的,在MySQL中,只有InnoDB存储引擎才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 DDL、DML、DCL 操作,比如 insert,update,delete 语句,默认是自动提交的。
事务的操作
#1、开启事务:Start Transaction
任何一条DML语句(insert、update、delete)执行,标志事务的开启
命令:BEGIN 或 START TRANSACTION
#2、提交事务:Commit Transaction
成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
命令:COMMIT
#3、回滚事务:Rollback Transaction
失败的结束,将所有的DML语句操作历史记录全部清空
命令:ROLLBACK
#设置提交方式
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
事务四大特征:
事务隔离级别
设置隔离级别
-- 查看隔离级别
show variables like '%isolation%';
-- 设置隔离级别
/*
set session transaction isolation level 级别字符串
级别字符串:read uncommitted、read committed、repeatable read、serializable
*/
-- 设置read uncommitted
set session transaction isolation level read uncommitted;
-- 设置read committed
set session transaction isolation level read committed;
-- 设置repeatable read
set session transaction isolation level repeatable read;
-- 设置serializable
set session transaction isolation level serializable;