索引
索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
加快查找,可以理解为创建了一个索引目录每次查找会在目录中找到位置.
索引的目的在于提高查询效率,同样它也是约束(主键、唯一)。
索引的种类有:
普通索引:加速查找
主键索引:加速查找+不能为空+不能重复
唯一索引:加速查找+不能重复
联合索引(多列): - 联合主键索引 - 联合唯一索引 - 联合普通索引
添加索引的方法:
在已经存在的表中添加索引:
ALTER TABLE tablename ADD primary key()
ALTER TABLE tablename ADD unique key()
添加普通索引:
create index 索引名称 on tablename(列,..)
添加一个唯一索引
create unique index 索引名称 on tablename(列,..)
组合索引(最左前缀匹配):
- create unique index 索引名称 on 表名(列名,列名)
- drop unique index 索引名称 on 表名
- create index ix_name_email on userinfo3(name,email,)
- 最左前缀匹配
删除索引:
drop index 索引名称 on tablename
drop unique index 索引名称 on tablename
修改索引名称
对于MySQL 5.7及以上版本,可以执行以下命令
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name
对于MySQL 5.7以前的版本,可以执行下面两个命令(先删除再添加):
ALTER TABLE tbl_name DROP INDEX old_index_name
ALTER TABLE tbl_name ADD INDEX new_index_name(column_name)
两个名称的概念:
覆盖索引:直接从索引文件中拿出对应的值,不再表中查找。
索引合并:把多个单列索引合并使用。
索引是在MYSQL的存储引擎层中实现的根据搜索引擎分类:
B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。
HASH 索引:只有Memory引擎支持,使用场景简单。
R-Tree 索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型。
Full-text (全文索引):全文索引也是MyISAM的一种特殊索引类型,主要用于全文索引,InnoDB从MYSQL5.6版本提供对全文索引的支持。
hash索引:单值快、范围(慢)
btree索引: btree索引
二叉树 (一种算法实现的)
创建索引的时候要了解的知识:
1.创建一个索引,提高了查找效率但是,牺牲了增、删、改效率
2.会加大磁盘空间的开销
3.设置最短索引
4.命中索引
5.类型不一致 如果列是字符串类型,传入条件是必须用引号引起来,不然...
6:用索引查询范围的话,如果市住建则还是会走索引
7.当根据索引排序时候,选择的映射如果不是索引,则不走索引 特别的:如果对主键排序,则还是走索引
8.组合索引最左前缀 如果组合索引为:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 不使用索引
索引选择原则
1.较频繁的作为查询条件的字段应该创建索引
2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
3.更新非常频繁的字段不适合创建索引
4.不会出现在 WHERE 子句中的字段不该创建索引
不要过度索引,只保持所需的索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。 在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长
其他注意事项
避免使用select *
count(1)或count(列) 代替 count(*)
创建表时尽量时 char 代替 varchar
表的字段顺序固定长度的字段优先
组合索引代替多个单列索引(经常使用多个条件查询时)
尽量使用短索引
使用连接(JOIN)来代替子查询(Sub-Queries)
连表时注意条件类型需一致
索引散列值(重复少的列做索引)不适合建索引,例:性别不适合