索引:索引也需要占用额外的磁盘空间 innodb表数据文件本身也是索引,myisam:索引和数据文件是分离的
更新一个包含索引的表,要比更新一个没有索引表花费的时间更多,更新了值,也就是更新索引
创建表的时间需要考虑的因素:
1、关联程度 3张表,选好关联字段
2、每个字段的长度,也要考虑
3、涉及合理的索引列
4、表数据,要控制在合理的范围之内。可以在牺牲一定性能的条件下,满足需求。5秒以上就要考虑优化了。10秒以上一般是出问题了(缓存失效,缓存击穿。缓存雪崩)
索引类型:
btree mysql orcale默认都是树形结构的索引
hash:散列值,只能匹配=in() <=>(hash是不能排序的。排序时,索引是无效的)
创建索引:
普通索引
唯一索引:unique与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许空值。只有添加唯一键才会创建唯一索引。最好不要为空。unique not null
能在建表时创建好的条件,尽量在创建把条件约束好。不要创完之后再添加
alter table member add index card_index (card_id);:在表外面修改的方式添加索引
show index from test;:查看唯一索引
create unique index phone_index o member (phone);:创建唯一索引
alter table member add unique address_index (address);:在表外面修改表的方式创建唯一索引
unique cardid_index (card_id);:在表内创建唯一索引
主键索引:创建表的指定的主键就是索引。添加主键自动就是主键索引
主键:值唯一,一个表只有一个主键 不允许有空值 创建主键,自动主键索引
全文索引:适合在进行模糊查询的时候使用,可以在一篇文章中检索文本信息
create fulltext index notes_index on test2 (notes);:在表外添加全文索引
fulltext notes_index (notes);:建表时创建
drop index notes_index on test3;:删除索引
select * from test3 where (列名) like '%';:模糊查询索引
%:任意所有通配符
alter table test3 add fulltext notes_index (notes);
创建联合索引:指定一个索引名,一个索引名对应多个列名
联合索引,查询时必须按照创建时的顺序来进行查询
mysql机制:默认会找最短的索引列。最优索引选择
联合索引,从左到右侧开始,不能跳过索引,否则索引会失效
范围查询,有可能右侧的索引会失效
fulltext:全文索引
explain:查看索引类型
面试题:
现在一张表的查询速度是7.62s
该如何解决这个问题?
首先查缓存,看是不是请求到了后端数据库
再看索引,请求的列值不是默认的索引,添加一下即可
mysql的事务:
事务是一种机制,一个操作序列。包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行
不可分割的单位
事务的特点ACID:
A:原子性:最小单位,事务里的所有条件都是一个整体,不可分割,要么都成功,要么都失败
C:一致性:事务开始之前喝事务结束之后,数据库的完整性约束没有被破坏
事务完成时,数据必须处于一致状态
事务开始前,数据库中的存储数据处于一致状态
进行中的事务,数据可能处于不一致的状态
在事务最终完成时,必须再次回到已知的一致状态
I:隔离性:指在并发环境中,当不同事务同时操作相同的数据时,每个事务都有各自完整的数据空间。对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的
修改数据的事务可以另一个使用相同数据的事务开始之前访问这些数据。或者在另一个使用相同的事务结束之后访问这些数据
mysql支持四种隔离级别:
1、未提交读,允许脏读,允许一个事务可以看到其他事务未提交的修改
2、提交读:事务只能查看已经提交的修改,未提交的修改是不可见的,防止脏读
3、可重复读,也是mysql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事务是否提交修改,可以防止脏读以及不可重复读
4、串行读,锁表,完全串行化,每一个事务都隔离,读写都阻塞。会降低数据库的效率