Mysql目前主要的几种索引类型

说实话,聊MySQL索引这事儿,我得先说个我当年踩坑的例子。
有次我接手一个老项目,查询慢得像爬,一查发现表上几百个字段都加了索引,结果更新操作直接卡到离谱。
说白了,索引是双刃剑,用好了省时省力,用不好还不如不用。

单列索引和组合索引的区别,我用人话讲。
比如一张用户表,你只关心按"年龄"查人,那加个单列索引就行。
要同时按"年龄"和"城市"查,组合索引就派上用场了。
有意思的是,组合索引得按顺序来,你放前面的"年龄"过滤了大部分数据,后面的"城市"才跟着生效,顺序错了索引效果大打折扣。
我记得有次测试,按"城市"加了个单列索引,结果同时按"年龄"和"城市"查时,索引根本没被用上,当时我也没想明白为啥,后来查资料才知道是顺序问题。

MySQL的索引类型,我按自己理解梳理下。
FULLTEXT索引适合中文搜索这种场景,但只能MyISAM引擎用,现在新项目基本不用了。
HASH索引我更少见,它用得像哈希表,但只能等于和IN操作,查询范围一广就废了。
BTREE是主流,啥场景都能用,查改增删都支持得不错。
RTREE主要用在GIS这种特殊场景,我那会儿做电商项目基本没碰过。

创建索引的方式也分几种。
有些表是现用现加,有些是设计时就规划好。
比如我最近做的项目,用户表的主键索引是建表时就一起搞定的,订单表这种经常更新的,主键索引是分阶段加的。
这块我没亲自跑过InnoDB引擎的在线DDL,但应该也能实现。
关键是看业务场景,更新频繁的表,索引要慎加。

执行计划分析是必须的。
我有个习惯,写完SQL先跑EXPLAIN,看type列是不是ALL,关键看key列是不是你建的索引。
有次给客户改一个慢查询,把EXPLAIN跑出来,发现WHERE条件居然在用表扫描,直接把索引删了重加,查询时间从十几秒降到零点几秒。
这种细节太重要了。

慢查询日志这块,说实话挺烦人,但确实有用。
我之前负责的系统,日志直接开到1 000MB,服务器CPU飙到7 0%,后来调到1 0%,发现就那几个SQL在拖后腿。
分析这些长时查询,能帮你找到索引缺失或SQL写得烂的地方。
数据量小的系统可以关掉,但大系统肯定要留。

最后说下资源分享,我整理的PDF文档里,关于索引的用法、常见误区、面试考点都挺全的。
对于Java新人或者准备面试的,我觉得挺有帮助的。
反正我当年准备面试时,这些资料把我坑过的索引陷阱都过了一遍,现在写SQL还特有心得。

mysql的索引有哪几种

嘿,咱们聊聊MySQL索引这事儿吧。
我以前在做项目的时候,就特别头疼这个。
记得那会儿,我们公司的一个电商项目,数据库里数据量挺大的,每次查询都要卡好久。
那时候我就开始研究,怎么优化数据库性能。

B-Tree索引,这玩意儿我挺熟的。
那会儿,我就在产品的一个用户表上,加了B-Tree索引,用户名那列。
这样一来,搜索用户名的时候,速度就快多了。
B-Tree索引就像是一棵树,数据都按照顺序排列,查询起来自然快。

哈希索引嘛,我就没怎么用。
因为它只适合那些哈希值唯一的列,像用户ID这样的。
不过,我记得有个朋友的项目,他就是用哈希索引来查找订单的,因为订单ID是唯一的。

全文索引,这玩意儿我印象比较深。
那时候我们有个论坛,用户会发很多帖子。
我就在帖子内容那列,加了全文索引。
这样一来,用户想搜索某个关键词,速度就快多了。

空间索引,这个我就没碰过。
不过,我知道它主要用于地理信息系统的查询,比如查询某个区域内的所有点。

联合索引,这东西我倒是经常用。
比如,我们经常需要根据用户名和邮箱来查询用户信息,我就在用户名和邮箱列上加了联合索引。
这样查询起来就快多了。

自适应哈希索引(AHI),这个是MySQL8 .0才出来的。
我还没怎么用,不过听说是结合了哈希索引和B-Tree索引的优点,对高基数列的查询特别有用。

位图索引,这个我也没怎么接触过。
不过,我知道它是用来对集合值进行查询的,挺适合那些数据量不大,但查询速度要求高的场景。

总之,不同类型的索引针对不同的场景。
选对了,查询速度就能大大提高。
不过,加索引也要谨慎,因为索引多了,更新数据的时候就会慢。
所以,得根据实际情况来决定。

mysql索引方式有哪些

B树索引:最常用,像大树一样平衡,插删改快,范围查强。

哈希索引:像字典一样快,但插删改慢。

全文索引:适合搜文章,速度快,占空间大。

空间索引:专查地图数据,占空间大。

组合索引:多个字段一起用,效率高,但更占空间。