建立索引的一些基本原则:

1. 索引不是越多越好,因为索引要占用额外的磁盘空间。特别是在写数据库的时候,索引也会自动同步更新,会降低写操作的性能。

2. 索引列最好是where条件后面所使用的列,或者是表连接所使用的列。

3. 使用索引的列最好是内容很少重复列,这样使用索引快速缩小查询范围。

4. 在对内容较多的列建立索引时,最好使用前缀索引。特别是针对只用前几个字符就能大幅缩小查询范围的内容。


索引的一些基本知识点:

1. 如果用的是组合索引,那么在查询时只要用到了组合索引中最左边的列,那么索引一般会被使用。
2. 如果使用like,%不能放到第一位,这样才有可能会使用到索引。
3. 如果列上有索引,那么'列名 is null'条件将会使用到索引。
4. 即使存在索引,如果MySQL发现使用索引可能比不使用更慢,则有可能不会使用到索引。比如索引列的值很分散,当前查询又是一个范围查询的时候。

5. 当where条件含有OR的时候,如果有一个条件列没有索引,那么索引不会被使用到。

索引分类:

1. 合成索引(Synthetic Index)
合成索引就是根据具体的来生成hash值,查找的时候通过hash值来查找就可以了。像blob、text这种数据直接放在where条件中查询效率是非常低的,所以可以使用合成索引。由于索引是hashcode,所以合成索引只能用于精确查询,对'<'、'>'等范围查找是没有作用的。我们可以使用MD5()、SHA1()或者CRC32()来生成索引,也可以在Java等编程语言中生成。如果生成的hash字符串尾部有空格,就不能存入char类型字段里,因为char会去掉尾部空格。

create table synthetic_test(
    id int,
    content text,
    hash_index varchar(50)
);

insert into synthetic_test values (1, 'abcd', md5(content));

mysql索引创建多少个合适 mysql索引是不是越多越好_数据库

这个时候我们就可以直接使用下面的SQL来查询:

select * from synthetic_test where hash_index = MD5('abcd');


2. 前缀索引(Prefix Index)

如果我们想对text或者blob进行模糊查找,我们可以使用前缀索引。先来看例子:

create table prefix_test(
    id int,
    content text
);
insert into prefix_test values (1, repeat('A', 50));
insert into prefix_test values (2, repeat('B', 50));
insert into prefix_test values (3, repeat('C', 50));

mysql索引创建多少个合适 mysql索引是不是越多越好_字符串_02

从上面可以看出,type=ALL,表名该表并未使用索引,所以查询时是效率最差的全表扫描。下面我来建立索引:

create index prefix_index on prefix_test (content(50));

上面的50表示prefix length,表示要以content内容的前多少位为标准建立索引。到底设置多少合适,这里就涉及到一个“索引选择性”的概念,不明白的可以参考这篇文章:

mysql索引创建多少个合适 mysql索引是不是越多越好_mysql索引创建多少个合适_03

再次select的时候,就使用了索引。但要注意:前缀索引只能匹配'XXX%'这种格式,'%XXX'是使用不到索引的。


https://blog.51cto.com/jaeger/1749147