mysql速度,表索引和select / update / insert

时间:2012-01-11 14:58:16

标签: mysql load indexing cpu myisam

我们有一个MySQL表,它有超过7.000.000(是七百万)行。 我们总是每5秒做一次SELECT / INSERT / UPDATE查询。

如果我们为该表创建MySQL INDEX,这是一件好事吗?是否会出现数据损坏或丢失MySQL服务等不良后果?

小信息:

  • MySQL版本5.1.56
  • Server CentOS
  • 表引擎是MyISAM
  • MySQL CPU负载在200% - 400%之间

5 个答案:

答案 0 :(得分:0)

索引将有助于精选。特别是如果与通常过滤的字段匹配良好。而且你有一个很好的简单主键。它们将有助于查询时间和处理周期。

缺点是,如果您经常更新/更改/删除这些记录,尤其是索引字段。即使在这种情况下,它也经常值得。

您要报告的数量(选择语句)与更新(应该!)会对您的初始设计以及您的数据库处于狂野状态时的后续调整产生巨大影响。既然您已经拥有了所拥有的东西,那么测试将为您提供所需的答案。如果您确实执行了大量选择查询和大量更新,那么您的解决方案可能是立即复制数据,然后复制到报告表。然后你可以像疯了一样索引,没有任何不良影响。

你实际上已经提出了一个大问题,你应该更多地研究这个问题。我上面提到的一般事项适用于大多数关系数据库,但是特定数据库(在您的情况下是MySQL)中也存在特定行为,主要是它们如何决定何时以及在何处使用索引。

答案 1 :(得分:0)

通常,索引将提高SELECT操作的速度并减慢INSERT / UPDATE / DELETE操作,因为在发生更改时必须修改基表和索引。

答案 2 :(得分:0)

很难说出这样的话。我希望索引本身可能需要一些时间。但在那之后你应该有一些改进。正如@Joe和@Patrick所说,它可能会损害你的修改时间,但选择会更快。

当然,还有一些其他方法可以提高插入和更新的性能。如果不能立即看到变化,那么你可以批量更新。

答案 3 :(得分:0)

如果您正在寻找性能,索引是可行的方法。索引可以加快查询速度。如果您有7百万条记录,则根据您的内存大小,您的查询可能需要花费很多秒钟。

一般来说,我会创建与最常用的SELECT语句匹配的索引。每个人都在谈论索引对表大小和速度的负面影响,但是我会忽略这些影响,除非你有一个表,你在95%的时间内进行插入和更新,但即便如此,如果那些插入发生在晚上并且你查询在白天,去创建那些索引,白天的用户会欣赏它。 如果有附加索引,对插入或更新语句的实际时间影响是多少,可能是0.001秒?如果索引为每个查询节省了很多秒,我想更新索引所需的额外时间非常值得。

我唯一一次遇到创建索引的问题(它实际上打破了程序逻辑)就是我们在没有主键的情况下向其他人创建的表中添加了主键,程序是期望SELECT语句按照创建的顺序返回记录。创建主键更改了,选择时没有任何WHERE子句的记录以不同的顺序返回。 这显然是一个错误的设计,但是,如果您有一个较旧的程序并且遇到没有主键的表,我建议在添加主键之前查看读取该表的代码,以防万一。

关于创建索引,字段的选择以及字段在索引中出现的顺序的最后一个想法会对索引的性能产生影响。

答案 4 :(得分:0)

我遇到的问题类似

我做了一些更改,1个查询从11秒传递到几毫秒

1-升级到MariaDB 10.1

2-将我的所有数据库更改为ARIA引擎

3-将my.cnf更改为严格的mininum

4-升级的php 7.1(但这个有一点影响)

使用CentOS进行5-对话:终端中的“Yum update”或通过ssh进行“更新”(保持所有内容都是最新的)

1- MariaDB是MYSQL的新开源版本

2- ARIA引擎是MYISAM的演变

3- my.cnf通常有太多的变化会影响性能 这是一个例子

[mysqld]
performance-schema=1
general_log=0
slow_query_log=0
max_allowed_packet=268435456

通过从my.cnf中删除所有额外选项,它告诉mysql使用默认值。

在MYSQL 5中(5.1,5.5,5.6 ......)当我这样做时;我只注意到一点不同。

但是在MariaDB中 - >像这样的小my.cnf有很大的不同。

*******所有这些变化;服务器硬件保持不变。

希望它可以帮到你