问题一:遇到一个问题,mysql库下表A有几万条数据;表B也有几万条数据,结果两表关联的时候,查询超级慢,30s内没反应。

问题一解决方案:

1. 加索引,但索引不要乱加,两表关联,必须要创建的索引是两表的管理字段 e.g

select * from A t1 left join B t2  on t1.did= t2.did and t1.uid = t2.uid

这种情况下,一定要给A表的uid和did创建索引,如果uid值是唯一那就创建唯一所引UNIQUE;否则就创建normal索引。

基本上加索引之后,查询速度立马就秒级了。

有索引就像新华字典的目录一样按照a,b,c顺序排好序,查找时速率才会高。

问题二:查询语句,主表换了之后,也加了关联字段的索引,结果还是很慢,就很奇怪,只是主表换了而已

问题二解决方案:原来是两张表的字符集不一样,B表utf8(3个字节)和表A utf8mb4(4个字节)字符集兼容问题。

select * from A left join B where A.id = B.id   A作为主表字符集包含B,可以很快查询导数据

select * from B left join A  where A.id = B.id   B作为主表则无法快速查询到数据,因为B无法兼容4个字符的数据,只能全表扫描

索引和主键的区别

索引分为:主键索引(SPATAIL)、唯一索引(UNIQUE)、常规索引(NORMAL)和全文索引(FULLTEXT);

创建索引一般为

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的

1.唯一性索引列允许空值,而主键列不允许为空值

2.主键列在创建时,已经默认为非空值 + 唯一索引了,在navicat中可能看不到,可以使用mysql查询语句来查看#show index from 表名;

3.主键可以被其他表引用为外键,而唯一索引不能

4. 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等

组合索引创建

当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引

减少开销:创建A B C 组合索引,相当于创建了(A)(A,B)(A,B,C)3个索引。 (a,b,c)多列索引和 (a,c,b)是不一样的

覆盖索引:查询 select A,B,C from 表名 ,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询。

组合索引的生效原则从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;

where a=1 and b=2 and c=3 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关 

索引基本创建注意事项

1. 索引不是越多越好,根据需要创建;对于重复数据的字段,没必要创建索引

2.涉及到关联表的一定要创建关联字段的索引

3. 一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引

4.使用短索引。对字符列进行索引,尽可能指定长度。短索引,不仅可以提高查询速度而且能节省磁盘空间

索引不生效的情况

1. 在索引字段上运算  where id-1=1 或者WHERE column(column)> 10;

2. 隐性转换。字符和数值型

3.like “%aaa%”  "%aaa"不会使用索引而like “aaa%”可以使用索引

4.如果多个OR条件中有其中一个条件没有索引,则必须进行全表索引

什么情况下适合建立索引?

一般来说,在WHERE和JOIN中出现的列需要建立索引。因为MySQL只对,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。

索引缺点

1..虽然索引大大提高了查询速度,同时会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存索引文件。
2.建立索引会占用磁盘空间的索引文件。如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

查看无效索引,清除无效索引?

查看索引是否生效:https://blog.csdn.net/u014470581/article/details/68065590

参考链接:https://www.cnblogs.com/yszr/p/10674729.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐