- | 索引的作用 1、约束 2、加速查找 - | 为什么索引可以这么快? 为什么索引可以这么快? name列建立索引 创建一个文件,name列所有数据拿出来 通过数字来标记,在一种特殊的数据结构中查找 层级越多,越快 (B-tree索引) | 索引的种类 - | 普通索引 -- 加速查找 1-创建表-创建索引 --创建表的同时创建索引 create table in1( nid int not bull auto_increment primary key, name varchar(32) not null, email varchar(64) not null, index ix_name (name) ); 2-创建索引 -- 在创建表之后再去创建索引 create index 索引名 on 表名(列名) create index index_name on table_name(column_name) 3-删除索引 # error drop index index_name on table_name; 4-查看索引 show index from table_name - | 唯一索引 -- 加速查找,约束列数据不能重复,null 1-创建表-创建索引 -- 创建表的同时创建唯一索引 create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, unique ix_name (name) ); 2-创建索引 -- 在创建表之后再取创建索引 create unique index 索引名 on 表名(列名) 3-删除索引 drop unique index 索引名 on 表名 - | 主键索引 -- 加速查找,约束列数据不能重复,不能null 1-创建表-创建索引 create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) ) OR create table in1( nid int not null auto_increment, name varchar(32) not bull, email varchar(64) not null, extra text, primary key(nid), index ix_name (name) ) 2-创建主键 alter table 表名add primary key(列名) 3-删除主键 alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; - | 组合索引 -- 多列可以创建一个索引文件 2-联合唯一索引: 有约束,两列数据都不相同,才能插入,不然报错 # 查找:最左匹配(最左前缀) select * from tb1 where name = ‘alex‘ select * from tb1 where name = ‘alex‘ and pwd = ‘123‘ select * from tb1 where pwd = ‘123‘ # 不会走索引 - | 索引的优缺点 --增删改慢,耗费资源 --查找快 - | 覆盖索引 -- 下例中nid设置了索引 select * from tb where nid=1; # 先去索引中找 # 再取数据表中找 select nid from tb where nid < 10; -- 情况应用上了索引,并且不用去数据库中操作,覆盖索引 # 只需要在索引表中就能获取数据 - | 合并索引 -- 列: nid, name(单独索引) ,email(单独索引), pwd select * from tb where name = ‘alex‘ select * from tb where email = ‘[email protected]‘ select * from tb where name = ‘alex‘ or email = ‘[email protected]‘ # 合并索引 - | 执行计划 -- 相对比较准确的表达出当前SQL运行的状况 -- 是否走索引,走的是什么索引 1、 explain SQL语句 type:ALL -- 全数据表扫描 type:index -- 全索引表扫描 2、limit select * from tb1 where email = ‘123‘; select * from tb1 where email limit = 1; ----- SQL: ALL、Index, 都是 有优化的余地 ----- 3、range 执行范围查询,type是range, 如果没有索引type是ALL,全表扫描 注意:!= 和 > 符号,不走索引
时间: 2024-08-10 00:05:47