网站建设知识
mysql中的索引
2025-07-22 10:01  点击:0

mysql中的索引 什么是索引? 索引是对数据库中某一个表的数据进行排序,这种排序并不是真正的对表中数据按照大小排序, 而是另外再创建一个索引文件来存放包含Btree数据结构,在数据结构中根据索引字段的值排序,数据结构的值包括: 索引字段的值和索引对应数据行的地址。
索引查询就是先查询这个索引文件来获得数据表中目的行的地址,然后直接根据地址去表中锁定行即可。 举一个例子,如一个user表中有100万行无序数据,现在查询“name=张三”的数据 不使用索引排序的话,就必须一行行的去查询比较name字段是否等于张三。运行量为N/2=50万 而如果使用了索引且索引字段是name,那么就会先去索引文件(有序)中,折半查询索引值为张三的数据行,从而获得 指向user表中满足name=张三的行的地址,通过地址直接从user表中取出查询的行。这样运行量为log2(N)=20 结果很惊人吧!不使用索引平均查询量是50万次,而使用索引的平均次数是20次。 可见使用索引是有巨大好处的。

在mysql中有三种索引:普通索引,唯一索引,全文索引。索引可以是一个字段或着多个字段组成。 1.主键

主键是特殊的唯一索引,但与唯一索引的区别就是,一个表中只能有一个主键,但是可以有多个

唯一索引。

2.复合索引

复合索引或者叫联合索引,复合索引就是索引用多个字段组成。一般用于需要经常对表中的多个字段做匹配查询的情况。

使用复合索引查询时必须按照的复合索引定义时的顺序从左到右写。必须满足“最右原则”

比如:定义一个普通索引 index u_index(a,b,c) 那么在查询时使用时,只能是 a 或a,b或a,b,c三种形式,不能出现b,c或者c,b,a等情况。这既是最左原则。

复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用。仅对后面的任意列执行搜索时,复合索引则没有用处。

3.索引和唯一性检查对数据插入,更新,删除的影响

很显然索引可以在很大程度上加快查询速度,但是在插入数据时,却会很大程度上减缓数据的插入,更新,删除操作,拿插入操作来说:有索引的情况下

在插入数据前,需要对索引文件进行写操作(索引文件是树的数据结构)。这一操作无疑降低了插入速度。如果插入的数据中有约束条件为唯一(unique)时,

插入前需要进行唯一性检查,这也会降低数据的插入速度。

针对这索引和唯一性检查会降低插入速度的问题,可以这样解决,在插入数据之前,关闭索引或者删除索引和关闭唯一性检查,插入数据后再打开或创建。 禁用索引 ALTER TABLE 表名 DISABLE KEYS;

打开索引 ALTER TABLE 表名 ENABLE KEYS;

删除索引 DROP INDEX 索引别名 ON table_name;

创建索引 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY 索引别名 ON table_name(属性(M) ASC|DESC);

禁止唯一性检查 SET UNIQUE_CHECKS=0;

开启唯一性检查 SET UNIQUE_CHECKS=1; 4.索引失效

(1)索引支持支持 = > < LIKE 等操作符,但是不支持 != IN NOT IN等。

(2)使用OR两侧必须都是索引 如: select * from user where id=1 or name='张三'; 那么id和name都必须是索引。

(3)使用LIKE进行模糊查询时,不能以%开头。如: select * from user where name LIKE '%三'; 但是'张%'是有效的。

(4)索引字段是字符串型,在查询的条件中一定要用引号括起来。

(5)多个字段组成的复合索引必须准守最左原则。 (6)如果mysql估计使用全表扫描要比使用索引快,则不使用索引

(7)在索引字段上使用了mysql函数