文章目录
- 什么是索引
- 索引的类型
- 主键索引(primary key)
- 普通索引(index)
- 复合索引
- 全文索引(fulltext)
- 空间索引
- 唯一索引
- 索引修改及删除
- Explain
- 一、using filesort(减慢查询效率)
- 二、Using temporary
- 三、using index
- 四、useing where
开干
什么是索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
简单说,把数据库比作一本书,索引就是书中的目录,索引就是用来快速查找数据库中的内容的。
索引的优点:
通过创建唯一索引,来保证数据库表中的每一行数据的唯一性。
• 可以加快数据的检索速度。
• 可以保证表数据的完整性与准确性
索引的缺点:
索引需要占用物理空间。
• 对表中的数据进行改动时,索引也需要跟着动态维护,降低了数据的维护速度。
索引的类型
在mysql中,常见的索引类型有:index普通索引、fulltext全文索引、primary key主键索引、unique唯一索引、复合索引及空间索引
。
接下来一一为大家介绍这几种索引及用法
主键索引(primary key)
这个最简单:每张表一般都会有自己的主键,只要有主键,mysql就会在主键上建立一个索引,这就是主键索引。主键是具有唯一性并且不允许为null。
主键索引的创建就不多说了,不会建议重学基础。
普通索引(index)
顾名思义就是各类索引中最为普通的索引,主要任务就是提高查询速度。其特点是允许出现相同的索引内容,允许空(null)值
CREATE TABLE `test` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
`username` varchar(20) DEFAULT NULL,
`servnumber` varchar(30) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`createtime` datetime DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,//主键
KEY `index_username` (`username`)//普通
) ENGINE=InnoDB DEFAULT CHARSET=utf8
或者:
-- 创建索引的基本语法
CREATE INDEX indexName ON table(column(length));
-- 例:length默认我们可以忽略
CREATE INDEX idx_name ON test(username);
复合索引
复合索引也叫组合索引,指的是我们在建立索引的时候使用多个字段,例如同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者是唯一索引。
alter table table_name add index index_name(column1,column2,column3);
复合索引的使用最左匹配原则
。举个例子 我们使用 phone和name创建索引。
参考:https://blog.csdn.net/wang121213145/article/details/124202161
全文索引(fulltext)
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。
它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。正常情况下我们也不会使用到全文索引,因为这不是mysql的专长。
alter table table_name add fulltext(column);
空间索引
空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。
创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎
为MYISAM的表中创建。空间索引一般是用不到了,了解即可。
唯一索引
alter table table_name add unique(column);
索引修改及删除
1.drop index 索引名称 on 表名;
2.alter table 表名 drop index 索引名;
Explain
通过explain查看sql的执行计划时,Extra字段的值往往会看到Using where; Using index; Using temporary; Using filesort
一、using filesort(减慢查询效率)
在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。
【这个 filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行了一个排序操作而已】。
filesort使用的算法是QuickSort,即对需要排序的记录生成元数据进行分块排序,然后再使用mergesort方法合并块。其中filesort可以使用的内存空间大小为参数sort_buffer_size的值,默认为2M。当排序记录太多sort_buffer_size不够用时,mysql会使用临时文件来存放各个分块,然后各个分块排序后再多次合并分块最终全局完成排序。
二、Using temporary
Using temporary表示由于排序没有走索引、使用union、子查询连接查询、使用某些视图等原因。因此创建了一个内部临时表。注意这里的临时表可能是内存上的临时表,也有可能是硬盘上的临时表,理所当然基于内存的临时表的时间消耗肯定要比基于硬盘的临时表的实际消耗小。
三、using index
using index :使用覆盖索引的时候就会出现
四、useing where
using where:在查找使用索引的情况下,需要回表去查询所需的数据