【问题标题】:MYSQL database optimization using indexing [closed]使用索引优化 MYSQL 数据库 [关闭]
【发布时间】:2013-02-21 14:49:00
【问题描述】:

我在 LearnBiz Simulations 工作,这是一家为管理教育领域进行模拟的自筹资金初创公司。

(a) 我们的网站目前为大约 16,000 人提供服务。目前,数据库大小为 30 mb,总共大约 90 个表,每个表可能有 5 到 50 列。我们在数据库中的所有表,都反复有新的插入、删除或更新行。但从未添加任何列。使用索引技术是否会产生任何问题?还有一些其他论坛和视频表明,即使插入或删除一行也会使索引变得无用!

(b) 我们网站上的最大工作是 mysql 查询,对 200-800 行之间的代码行进行一些处理。几乎 95% 以上的查询都有多个相等 where 子句,以查明所需的行。如果我理解正确,那么使用索引将帮助我们将流程加快数倍?

(c) 有一些模拟每分钟处理许多参与者的数据。对于此类模拟,目前我们甚至无法同时满足 50 名参与者的需求。采用索引是否有助于此类模拟承载更多用户?

(d) 我们目前拥有的服务器是带有 GoDaddy 的 VDS(每年花费约 400 美元)。为了让我们的网站更快,我们转向 DDS(每年花费大约 3000 美元)或使用 TokuDB 之类的东西是否有意义?有没有办法判断当前系统的用户容量,即服务器+数据库+编码?

【问题讨论】:

  • 这太宽泛、太模糊、无法确定,无法回答。但是:如果你使用任何数据库没有索引你疯了。索引是设计合理的数据库的核心。
  • 这样说吧,我调整了现有数据库以包含索引并添加 1 个中间表(大约 50 个条目)并调整了一个shite 脚本。这将其运行时间从 24 小时缩短到 5 秒。
  • 索引有很大的不同(对于一个粗略的例子,我今天有一个简单的查询,不使用索引查询大约需要半秒,使用索引相同的查询大约需要 0.0001一秒)。在对索引进行排序之前,升级服务器是不值得的。使用 WHERE 子句,我假设您有很多 OR 的查询。如果是这样,通常会更快地进行多个查询(每个可能的 OR 值一个)并将结果联合起来。使用索引,如果第一次设置或有重大更改,请尝试 ANALYZE TABLE。

标签: php mysql database indexing database-optimization


【解决方案1】:

关于索引问题,索引不仅是可取的,而且是需要来“加速”事情。据我了解(用“外行”的话来说),索引的功能是加快表内数据的搜索和恢复。

使用索引的原因:

  1. 唯一标识每个表上的每一行(毕竟主键是一个索引)
  2. 索引已排序(即使数据未排序)
  3. 加快搜索和过滤速度:索引可以更快地恢复数据,因为它“保存”了数据在表中的位置(它“精确定位”了您要恢复的数据)。此外,它使数据库引擎更容易过滤数据(过滤排序数据总是比过滤加扰数据更快、更简单)
  4. 优化使用相关表时恢复数据的方式:必须为每个外键建立索引,以加快涉及主外键关系的查询

我使用一些“拇指规则”来决定哪些字段需要被索引:

  • 每个主键都有索引(很明显一个:主键必须是唯一的,不能为空)
  • 必须为每个外键编制索引(以使主外键关系有效)
  • 必须为我需要执行搜索的每个数字或日期字段编制索引。也就是说,我尽量避免对 double(或任何其他浮点数字类型)字段进行索引,因为它们通常用于存储不打算搜索的值。
  • 必须为我需要执行搜索的每个 charvarchar 字段编制索引。尽量避免在 text 字段上使用索引,因为它们可以包含非常大的值。
  • 避免索引二进制 (blob) 字段...没有意义
  • 不要陷入将所有内容编入索引的诱惑。花点时间决定哪些字段必须编入索引,哪些字段不得编入索引。

【讨论】:

    【解决方案2】:

    (a) 那些论坛和视频毫无价值,盲目地重复半真半假(是的,使用索引时有开销,只是性能增益通常超过它很多倍)

    (b) 在大多数情况下,尽管要小心创建实际有用的索引。 MySQL 文档有一个whole chapter on how to do that(通常你也想看看整个Optimization 章节

    (c) 确保您的基准测试没有模拟过大的流量。例如,一次 50 个真实用户不会每秒产生 50 个连接。同样,在实施索引和优化查询后,您的性能应该会提高

    (d) 如果您的数据库服务器配置不正确,再多的更好的资源也无济于事(您是否使用查询缓存?您是否允许 MySQL 使用足够的内存来将表保存在内存中?等等)

    总结一下:阅读你的 MySQL 服务器的基本配置,以便它可以有效地利用你的资源(默认值通常不够好),还可以查看手册中的优化章节。

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 1970-01-01
      • 2018-12-09
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多