更多的MySql表会减慢MySql数据库的搜索速度吗?

时间:2010-10-13 16:25:46

标签: php sql mysql html database

我有一个分类广告网站,我正在考虑重新设计数据库。

目前我在 db 中有 7个表。每个“ MAIN CATEGORY ”一个表格。 例如,我有一个“车辆”表,其中包含有关以下类别分类的所有信息:

   cars
   mc
   mopeds/scooters
   trucks
   boats
   etc etc

但是,网站上的用户通常会搜索特定类别。例如,用户选择“汽车”类别进行搜索,然后输入关键字。

我的代码今天将在整个车辆表中搜索所有记录,字段“ category ”等于“cars”,并且然后得到他们的详细信息:

 "SELECT * IN vehicles WHERE category='cars' AND alot of other conditions" // just for example, not tested

我正在考虑为这些“子类别”中的每一个创建一个表。 即,一个用于汽车,一个用于mc,一个用于卡车等,因此搜索不是通过不需要的信息完成的。

这会提高搜索速度吗?因为我已经计算出我至少需要30个左右的表。

由于

4 个答案:

答案 0 :(得分:4)

使用正确索引的表和“合理”行数,您不会从这种方法中获得太多速度。你在执行速度方面获得的任何东西都会因为你的编程变得更加复杂而在上市时间中失去。

除非在使用代表性数据集进行测试时遇到性能问题,否则请勿执行此优化。

答案 1 :(得分:1)

它将提高同一类别内的搜索速度。如果您需要来自不同类别的汇总信息,它可能会减慢查询速度。您需要确定哪个是您网站的最佳选择。

在vehicle表中总共有多少条记录。添加适当的索引很可能会大大提高搜索速度。

查看MySQL中的“EXPLAIN”查询选项。了解这一点将有助于您使用索引优化数据库。

答案 2 :(得分:1)

性能优化与科学一样重要,要真正理解什么是最佳选择,需要进行一些基准测试;任何根据可用信息提供明确答案的人都是错的。也就是说,对你的情况有一些想法:

  • 您没有说明您的类别列现在是什么类型,但如果它是字符串类型,它可能比其他选项使用更多空间,从而使表更大。正确的索引可以极大地提高速度,但是索引较大的较大表总是能够做到恰好相反。

  • 正如其他人已经提到的,在类别搜索的简单情况下,您在类别中的查询会更快。更快的速度取决于您当前表中的数据量,如果您必须加入其他表以满足您提到的所有其他条件的需要,则可以取消增加。 OTOH,它实际上可能在某些连接情况下加快速度(例如,如果你正在与你的无所不包的表进行自我连接)。

  • 如果您正在处理大量数据,拆分成多个表可以大大简化备份。

  • 出于性能原因,拆分到多个表中还可以更轻松地跨多个服务器对数据进行分片。同样,它可以使复制设置更容易继续运行。

  • 如果您正在跟踪特定类别的数据,那么单独的表可以让您更好地规范化数据库,并且可能会因使用更小的表而获得一些不错的性能。

  • 分裂显然意味着修改代码。如果您的代码属于旧的,吱吱作响的类型,那么您可以通过清理获得性能提升。当然,你也有可能会破坏某些东西....

  • 检查索引。错误的索引是性能不佳的一个常见原因,但相对容易修复,并且花费了一些时间来进行自我教育。 MySQL的EXPLAIN可以告诉您查询是否使用索引,索引统计信息(查看文档)可以告诉您索引的工作效率。

  • 最后,谈到代码,请检查一下。无论数据库是如何设置的,都尝试尝试一些方法。例如,在代码中执行几个单独的查询并加入结果可能比在数据库中进行连接更快。同样,在代码中进行排序等操作通常会更快,特别是在连接或某事意味着数据库必须创建临时文件/表的情况下。再次,检查EXPLAIN输出,如果无法消除查询中的问题区域,请查看它是否有助于简化查询并在代码中执行更多工作。在Web服务器比数据库服务器有更多可用资源的常见情况下,这可能特别有用。

还有许多因素需要考虑。但最终,做出这些决定的最佳方式不是花时间思考理论,而是将两种方法都用于测试。创建一些测试数据库并对您经常运行的查询进行基准测试,无论是否有模拟负载。你会得到答案。

答案 3 :(得分:0)

如果您使用的是php,请尝试

$ query = mysql_query($ sql); while($ row = mysql_fetch_assoc($ query)){  $ tempvalue [] = $行; }

然后循环使用类似句子的信息

foreach($ tempvalue as $ key => $ value){   写表..... }

也许mysql并不慢,问题在于代码

测试不要杀死任何人=)