首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql添加索引变慢

基础概念

MySQL索引是一种数据结构,用于快速查询、更新数据库表中的数据。索引可以显著提高查询速度,但同时也会增加写操作的开销,因为索引本身也需要维护。

相关优势

  1. 提高查询速度:索引可以减少数据库需要扫描的数据量,从而加快查询速度。
  2. 优化排序和分组:索引可以帮助数据库更快地进行排序和分组操作。
  3. 唯一性约束:通过唯一索引,可以确保表中的某些列的值是唯一的。

类型

  1. 单列索引:只包含单个列的索引。
  2. 复合索引:包含多个列的索引。
  3. 唯一索引:确保列中的值是唯一的。
  4. 全文索引:用于全文搜索。
  5. 空间索引:用于地理空间数据。

应用场景

  • 频繁查询的列:对于经常用于查询条件的列,添加索引可以显著提高查询速度。
  • 排序和分组:对于经常需要排序和分组的列,添加索引可以提高这些操作的效率。
  • 外键:对于外键列,添加索引可以提高连接操作的效率。

问题:MySQL添加索引变慢

原因

  1. 数据量大:当表中的数据量很大时,添加索引需要花费更多的时间。
  2. 磁盘I/O瓶颈:如果磁盘I/O性能较差,添加索引的速度会受到影响。
  3. 锁竞争:在添加索引的过程中,可能会与其他写操作发生锁竞争,导致速度变慢。
  4. 索引类型选择不当:选择不适合当前数据特点的索引类型也会影响添加速度。

解决方法

  1. 优化磁盘I/O
    • 使用SSD硬盘。
    • 使用RAID配置提高磁盘读写性能。
  • 减少锁竞争
    • 在低峰期添加索引。
    • 使用在线DDL(Data Definition Language)操作,如MySQL 5.6及以上版本支持的ALGORITHM=INPLACE选项。
  • 选择合适的索引类型
    • 根据查询需求选择单列索引或复合索引。
    • 对于全文搜索,使用全文索引。
  • 分批添加索引
    • 如果数据量非常大,可以考虑分批添加索引,减少单次操作的数据量。

示例代码

代码语言:txt
复制
-- 添加单列索引
ALTER TABLE table_name ADD INDEX index_name (column_name);

-- 添加复合索引
ALTER TABLE table_name ADD INDEX index_name (column1, column2);

-- 添加唯一索引
ALTER TABLE table_name ADD UNIQUE INDEX index_name (column_name);

-- 添加全文索引
ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column_name);

参考链接

通过以上方法,可以有效解决MySQL添加索引变慢的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • mysql 查看索引添加索引、删除索引命令添加索引删除索引

    查看索引 mysql> show index from tblname; mysql> show keys from tblname; mysql> show index from center_bank_rate...· Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · Seq_in_index 索引中的列序列号,从1开始。...· Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 · Cardinality 索引中唯一值的数目的估计值。...基数越大,当进行联合时,MySQL使用该索引的机 会就越大。 · Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。...· Comment 添加索引 ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) 删除索引 mysql> alter

    3.4K10

    MySQL理解索引添加索引的原则 转

    索引用于快速找出在某个列中有一特定值的行。不使用索引MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。...MySQL使用B树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。...使用索引需要注意: ⑴只对WHERE和ORDER BY需要查询的字段设置索引,避免无意义的硬盘开销; ⑵组合索引支持前缀索引; ⑶更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本...所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了 详解: 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。...两个或更多个列上的索引被称作复合索引。 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引

    1.7K31

    Mysql如何给字符串添加索引(前缀索引)

    在日常开发中,我们经常给字符串添加索引,那么给字段添加索引有什么技巧吗,我们看看下面的例子,我们给一个邮箱添加索引,应该如何添加呢 看看下面这条sql select * from user where...email ='jiepi@qq.com' 如果我们不添加索引,肯定是要进行全表扫描的,那么我们如何添加呢有两种方式 alter table user add index index1(email)...alter table user add index index2(email(6)) 上面两种方式都是在添加索引,不同点就是第二种添加的仅仅是邮箱的前缀索引,那么他的结构表现如下图 ?...前缀索引对覆盖索引的影响 上面我们分析了,前缀索引影响扫描的行数,其实,他也是会影响覆盖索引的,正如下面例子 select id,email from user where email='zhangsan...(18),完全包含字段的长度,但是我们依然要回表查找主键索引,因为系统并确定前缀索引是否有截断完成信息, 总结就是使用前缀索引,就无法使用覆盖索引

    9.7K20

    MySQL如何给JSON列添加索引(二)

    上一篇文章《MySQL 8.0 JSON增强到底有多强?...(一)》,我们简单介绍了MySQL中JSON数据类型,相信大家对JSON数据类型有了一定的了解,那么今天我们来简单看下如何在JSON列上添加索引? InnoDB支持虚拟生成列的二级索引。...在虚拟列上添加或删除二级索引是就地操作。 通过索引生成列以提供JSON列索引 JSON 不能直接对列进行索引。...要创建间接引用此类列的索引,可以定义一个生成列,该列提取应建立索引的信息,然后在生成的列上创建索引,如下所示: 说明:8.0和5.7都支持在生成列上添加索引 mysql>CREATE TABLE jemp...`c`,'$.name') 1 row in set (0.00 sec) 在MySQL 8.0.21和更高版本中,还可以JSON使用JSON_VALUE()带有表达式的函数在列上创建索引,该表达式可用于优化使用该表达式的查询

    7.3K11

    MYSQL 如果索引优化仅仅是添加索引,too young to simple

    MYSQL索引优化,如果此时此刻看到索引的优化,仅仅想到添加适合的索引,是不完全的,索引的优化本身就具有很多的不确定性。...(如果碎片率高,就需要通过整理碎片来提高性能) 以上就是随着时间的推移,索引的衰减 2 数据量的加大,索引的衰减,这点与MYSQL的表的BTREE+的数据存储雷同,基于索引本身随着数据流的加大,根+叶子节点可能会发展到超过...下面就通过各种语句,来获取索引的状态,动态调整索引,及时添加或清理失效的索引。...(仅仅在MYSQL8 中作用,information_schema) select it.name,ii.index_count from innodb_tables as it inner join...sys.statements_with_runtimes_in_95th_percentile where query like 'select%'; 以上的信息都可以帮助DB 人员快速了解当前的MYSQL

    79910

    什么时候 MySQL 查询会变慢

    前面几篇文章和小伙伴们聊的基本上都是从索引的角度去优化 MySQL 查询,然而,索引创建的好,并不意味着查询就一定快,影响查询效率的因素特别多,今天我们就来聊一聊这些可能影响到查询的因素。 1....最后就是执行器了,执行器调用搜索引擎提供的具体接口去获取数据。 这张图大家大概有个印象,在后续的 MySQL 查询和优化中,很多东西就容易理解了。 接下来我们就来看看什么情况下查询会变慢。 2....如果在查询的时候使用了唯一性索引的话,那么查询到记录之后 MySQL 就停止扫描了;但是如果查询的时候使用的是非唯一性索引的话,那么扫描到第一条记录之后,还会继续向后扫描,直到扫描到第一条不满足条件的记录为止...在前面的文章中,松哥也和大家提到过覆盖索引,如果索引设计得当,那么在查询的时候可以通过覆盖索引来提高查询的性能,但是如果使用了 select * 那么大概率是用不了覆盖索引了。 4....直接从索引中过滤出来想要的值并返回给客户端,这种时候,过滤虽然发生在 MySQL Server 层,但是由于不需要回表,效率也还过得去。

    17620

    MySQL 8.0 新特性:多值索引 --如何给JSON数组添加索引(三)

    上一篇文章《MySQL如何给JSON列添加索引(二)》中,我们介绍了如何给JSON列添加索引,那么接下来,我们看下如何给JSON数组添加索引?...MySQL 8.0新增的一种索引类型:多值索引;从MySQL 8.0.17开始,InnoDB支持多值索引。多值索引是在存储值数组的列上定义的二级索引。...“普通”索引对每个数据记录有一个索引记录(1:1)。对于单个数据记录(N:1),多值索引可以有多个索引记录。多值索引旨在为JSON数组建立索引。...为了解决这个问题,我们可以在JSON列(custinfo)中的zipcode数组上添加一个多值索引,如下所示: mysql>ALTER TABLE customers ADD INDEX zips( (...好了,今天就先介绍到这里,关于JSON更多内容,后续会慢慢进行介绍; 关联阅读 MySQL 8.0 JSON增强到底有多强?(一) MySQL如何给JSON列添加索引(二)

    14K22

    MySQL 升级到 8.0 变慢问题分析

    整个过程持续了大概一个小时,直到给某条业务 SQL 对应的表加上索引,问题才得到解决。...这个基表的名字和 MySQL 5.7 中不一样了,它的行为也发生了变化,就是这个行为的变化在某些场景下阻塞了业务 SQL,导致大量业务 SQL 执行变慢。...从 data_locks 表里读取数据的线程长时间持有 trx_sys->mutex 互斥量,就会长时间阻塞其它 SQL 执行,导致其它 SQL 排队等待,出现堆积,表现出来的状态就是 MySQL 整体都变慢了...背景介绍小节中提到的那条业务 SQL 对应的表上创建了一个索引。...在那个表上创建索引之后,那条业务 SQL 执行过程中就不需要对 300 万条记录加锁了,而是只会对少量记录加锁,data_locks 表中的数据量也就变的很少了,不需要长时间持有 trx_sys->mutex

    1K20

    mysql 前缀索引_MySQL前缀索引

    有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。...前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。...Tips:index_column 代表要添加前缀索引的列 在数据增长很快的表中,上述方式计算就不准确了,原因在于数据增长很快的表 index_column 字段重复的记录和总记录数据变化都比较快,那么计算出来的前缀索引长度也是随着变化很快的...MySQL 无法使用前缀索引做 ORDER BY 和 GROUP BY , 也无法使用前缀索引做覆盖扫描。...后缀索引 MySQL 没有提供后缀索引,事实上,一些业务场景对后缀匹配选择性更高,比如我曾经参与过的项目,手机的入网标示imei号,前缀都是86等固定的国家编号开头,这个时候可以将字符反转后存储,就可以建立选择性较高的前缀索引

    4.8K30
    领券