存储引擎、索引
存储引擎
定义:
就是数据库存储数据的技术,可以类比成发动机引擎,不同的引擎性能各不相同
分类*****
最常见的两个存储引擎是innodb和myisam,区别如下:
1、innodb
--1、(默认版本是5.5及以上)
--2、支持事务
--3、不支持全文索引
--4、索引和数据在同一文件中,.ibd
表的结构是在.frm文件中
2、myisam
--1、(默认版本5.5以下,主要5.3用的人最多)
--2、不支持事务
--3、支持全文索引
--4、.frm:表结构
.MYD:表数据
.MYI:表索引
3、memory(不常用)
ps:innodb不支持全文索引
国内普遍用的全文索引 sphinx(斯芬克斯)
索引
类比
相当于新华字典的目录,我们可以把索引理解成一个特殊的文件,
如果没有这个文件,查询是从前往后查找数据的,
如果有这个文件,会按照一种特殊的数据结构(二叉树)查找数据
作用
加快查询的数据
分类
1、主键索引:加快查询 + 不能重复 + 不能为空 primary key
2、唯一索引:加快查询 + 不能重复 unique(列名)
联合唯一索引:加快查询 + 不能重复 unique(列名1,列名2,..)
3、普通索引:加快查询 index(列名)
创建及删除
创建
1、建表时创建
create table t1( # 主键的创建 id int auto_increment primary key, name varchar(32) not null default '', age int not null default 0, num int not null default 0, # 联合唯一索引的创建 unique uni_name_num (name,age), # 普通索引的创建 index ix_age (age) ).engine=innodb charset=utf8;
2、表存在后创建
# 主键索引的创建 alter table t1 change id id int auto_increment primary key # 唯一索引的创建 create unique index ix_name on t1(name) create unique index ix_name_age on t1(name,age) # 普通索引的创建 create index ix_age on t1(age)
删除
# 如果主键是自增的,则无法删除,要先取消自增再删除 alter table t1 change id id int; alter table t1 drop primary key; # 删除唯一索引和普通索引一样 drop index ix_name on t1;
索引的优缺点
优点:
查询数据速度快
缺点:
版本5.3以下:
删除和修改数据的速度会变得很慢,会重构索引
版本5.5以上:
删除和修改数据的速度不是特别慢
索引的使用
数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引
来查询,如果以错误的方式使用,则即使建立索引也不会生效
错误索引案例
# -like '%xx' select * from t1 where name like '%cn%'; # -使用函数 select * from t1 where reverse(name) = 'xxx'; # -order by select email from t1 order by name desc; # 当根据索引排序时,选择的映射如果不是索引,则不走索引 # 特别的:如果对主键排序,则还是走索引 select * from t1 order by id;
explain 工具
查看sql语句是否用得上索引,或者查看sql执行效率的工具
给执行的sql语句出一个报告,通过此报告来判断sql语句的
执行效率和效果(不一定都按结果上来)
SQL语句的规则
1、不建议使用like进行搜索
2、不建议使用函数
3、组合索引最左前缀
如果组合索引为:(name,email)
where name and email --使用索引
where name --使用索引
where email --不适用索引
explain查询之后参数的含义(了解)