我正在编写一个带有MySQL表的应用程序,该表可以索引3列。我担心在表达到大量记录后,保存新记录的时间会很慢。请告知如何最好地接近列的索引。
更新
我正在索引一个point_value,即 user_id和event_id,都是必需的 面向客户的目的。为 例如得分棒球跑 通过玩家ID和游戏ID。什么会 插入约200新的成本 在表格保持之后记录一天 记录两个赛季,比如72,000 跑了,经过5个赛季,也许是一个 二十万记录?仅适用于 插图,但我期待着 插入25到200条记录a 一天。
答案 0 :(得分:12)
索引最符合逻辑的内容(希望显而易见的是,例如,CUSTOMERS表中的客户ID列)。
然后运行您的应用程序并定期收集统计信息以查看数据库的执行情况。关于DB2的RUNSTATS就是一个例子,我希望MySQL有一个类似的工具。
当你发现一些经常运行的查询进行全表扫描(或由于其他原因需要太长时间),那么,,只有,你应该添加更多的索引。优化一个月一次的午夜运行查询几乎没有什么好处,所以它可以在12:05而不是12:07结束。但是,将面向客户的查询从5秒减少到2秒(这仍然太慢,面向客户的查询应尽可能低于秒)是一项巨大的改进。
更多索引会降低插入速度并加快查询速度。所以它始终是一种平衡行为。这就是为什么您只在针对问题的特定响应中添加索引的原因。其他任何事情都是过早优化,应该避免。
此外,请定期重新访问您已有的索引以查看是否仍需要它们。可能导致您添加这些索引的查询不再经常运行以保证它。
老实说,我不相信索引表上的三列会导致你受苦,除非你打算存储大量的行:-) - 索引非常有效。
编辑后指出:
我正在为
point_value
,user_id
和event_id
编制索引,这些都是面向客户端所需的全部内容。对于诸如通过玩家ID和游戏ID对棒球运行进行评分的实例。在该表保存了两个赛季的记录(比如72,000次运行)之后,每天插入大约200条新记录的成本是多少,在5个赛季之后,可能有25万条记录?仅用于说明,但我希望每天插入25到200条记录。
我的回答是,每天200条记录对于数据库来说是一个极小的值,你绝对不会担心这三个索引。
就在本周,我在工作中的一个数据库表中导入了一天的交易,它包含210万条记录(我们从25台不同的机器每天至少获得一笔交易)。它有四个独立的复合键,比你的三个单独键更密集。
现在被授予,这是在DB2数据库上,但我无法想象IBM 所以比MySQL只能处理不到0.01%的DB2负载的MySQL人员要好得多。
答案 1 :(得分:10)
我使用我的真实项目和真正的MySql数据库进行了一些简单的测试。
我的结果是:将平均索引(索引中的1-3列)添加到表中 - 使插入速度降低2.1%。因此,如果添加20个索引,则插入速度将降低40-50%。但您的选择将快10到100倍。
添加多个索引可以吗? - 这取决于:)我给你我的结果 - 你决定了!
答案 2 :(得分:6)
选择查询没什么,虽然更新,特别是插入的速度会慢一些 - 在你开始同时插入很多行之前你不会注意到......
事实上,在以前的雇主(单用户,桌面系统)中,我们实际上在开始“导入例程”之前删除了索引 - 在将大量记录插入同一个表之前首先删除所有记录...
然后当我们完成插入作业时,我们将重新创建索引......
通过在开始操作之前删除索引并在之后重新创建索引,我们可以节省90%的时间用于此操作...
这是一个Sybase数据库,但相同的数字适用于任何数据库......
所以小心使用索引,他们 FAR 来自“免费”......
答案 3 :(得分:3)
仅用于说明,但我希望每天插入25到200条记录。
使用这种插入速率,索引额外列的成本可以忽略不计。
答案 4 :(得分:1)
如果没有关于表中数据的预期使用情况的更多详细信息,担心索引会减慢你的气味,就像应该避免的过早优化一样。
如果您真的很关心它,那么在最糟糕的情况下设置一个测试数据库并模拟性能。证明可能或不是问题的测试可能比尝试猜测并担心可能发生的事情更有用。如果出现问题,您将能够使用测试设置尝试不同的方法来解决问题。
答案 5 :(得分:0)
索引用于加速数据检索,因此问题应该是“我需要快速访问哪些数据?”。如果没有索引,某些查询将执行全表扫描(遍历表中的每一行)以查找所需的数据。有了大量的记录,这将是一个缓慢而昂贵的操作。如果是每月运行一次的报告那么也许没关系;如果是经常访问的数据,那么您将需要索引来为您的用户提供更好的体验。
如果您发现插入操作的速度因索引而变慢,那么您可以通过在问题上投入更多的CPU,RAM和更好的硬盘驱动器技术来解决硬件级别的问题。
答案 6 :(得分:0)
Pax说的是什么。
对于您描述的维度,我能想到的唯一重要问题是“未能索引多个数据库列的成本是多少?”