在处理测试数据库性能的项目时,我发现了添加索引的问题。 在网上冲浪了很多,我还有几个问题。
在哪个表/列上添加索引是个好主意?
我有不同类型的表,例如一个表格,其中包含预定义的国家/地区名称。因此,我认为在列country_name
上添加索引是个好主意。我知道这很好,因为我很少有机会在这个表中添加新记录,并且在where子句中使用country_name
时查询会更快。
但是更复杂的表如客户端(或任何其他表可能很多并且包含大量列的表)呢?
综合指数怎么样?
什么时候组合索引是一个好的idead,是时候我会一起查询很多客户first_name
和last_name
?或者最好是将这些列添加到这两列?
悖论吗
在stackoverflow上阅读this answer后,我留下了一个悖论。知道数据会显着增加,这是我添加索引的一个原因。但随着索引减慢更新/插入速度,它会同时降低速度。
e.g。我必须每天跟踪clients
(> 3M记录)的重量。添加索引可以帮助我更快地获得结果。但我每天获得大约1000个新客户,所以我必须插入它们并更新它们的权重。这意味着由于插入/更新而导致性能降低。
mySQL特定添加
在不同的存储引擎上结合索引是否有优势? 至于现在我只使用了innoDB。
答案 0 :(得分:2)
我将专注于"综合指数"问题的一部分,但用它来涵盖我认为可以帮助你更好地理解索引的其他几点。
综合指数怎么样?
什么时候组合索引是一个好的idead,是不是我会用first_name和last_name一起查询很多客户端?或者最好是将这些列添加到这两列?
索引就像电话簿一样。电话簿是包含Last_Name
,First_Name
,Address
和Phone_Number
字段的表格。该表的Last_Name,First_Name
索引。这就是你所说的组合索引。
让我们说你想找到约翰史密斯"在这本电话簿中。这将适用于这样的查询:
SELECT * FROM PhoneBook WHERE First_Name = 'John' and Last_Name = 'Smith';
在您的电话簿中,这很容易。只需找到" Smith"的部分,然后找到该部分内的所有" John"
现在想象一下,Last_Name,First_Name
上没有合并索引,而是有单独的索引:一个用于Last_Name
,另一个用于First_Name
。您尝试运行相同的查询。因此,您打开Last_Name索引并找到Smith的部分。有很多。你去找John,但First_Name字段没有按正确的顺序排列。也许它现在由地址订购了。更有可能在数据库中,这个特定的史密斯先生或史密斯先生第一次搬到城镇时。您必须通过所有史密斯来查找您的电话号码。那不太好。
所以我们转而使用First_Name索引。您执行相同的过程并找到" John"的部分。这不是更好。我们没有指定按姓氏额外订购,所以你必须通过约翰的所有找到你的史密斯。
完全数据库索引的工作原理。每个索引只是索引中包含的信息的副本,以索引指定的顺序存储,以及指向完整记录的指针。还有一些额外的优化,比如不填写每个页面的索引,以便您可以更高效地添加新条目而无需重建整个索引(您只需要重建该页面),但简而言之,每个新索引都是另一个手机你必须保持的书。希望你现在可以看到为什么COLUMN LIKE '%keyword%'
搜索是如此糟糕。
要了解索引的另一件事是,它们的存在是为了支持查询,而不是表格。您不一定要查看表格并考虑您要关键的列。您希望查看查询并考虑它们为每个表使用的列。
因此,您可能仍需要First_Name和Last_Name的单独索引。这将是您需要支持使用不同方法查询表的不同查询。这也是为什么应用程序永远不会让您在任何领域进行搜索的原因。每个额外的可搜索字段都需要新的索引,这会为应用程序增加新的性能成本。
这也是为什么在您的应用程序中拥有一个单独且有组织的数据库层非常重要的原因。它可以帮助您处理您真正拥有的查询,从而确定您真正需要的索引。良好的分层应用程序设计,或面向服务人群的精心设计的服务层,实际上是一个性能的东西,因为数据库性能往往削减到更大的应用程序性能的核心
答案 1 :(得分:0)
好了你需要知道2件事:索引是为了提高搜索速度(选择)但是如果你需要做一个轨道会减慢你的更改(插入/更新/删除),尝试仅使用表来收集信息,和athor表是sintetisez关于你的轨道的信息。例如:
表格跟踪(ip,date,page,...) table hour_track(page,number_visitator,date)
在表格跟踪中,您只会添加,不会更新或删除。您将使用cronjob(或athor thenique)生成的表hour_track,然后您将添加组合索引(most_search,secound_most_search,...)。组合索引会提高你的速度,因为你的数据库只需重新制作1个arbores不多,如果maiby你需要一个列的索引,因为你的查询更多地使用了列,你可以添加列作为索引声明的第一个。你可以更多地红色here