【问题标题】:Will more MySql tables slow down searches on MySql database?更多的 MySql 表会减慢 MySql 数据库的搜索速度吗?
【发布时间】:2010-10-13 16:25:45
【问题描述】:

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

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

   cars
   mc
   mopeds/scooters
   trucks
   boats
   etc etc

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

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

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

我现在正在考虑为这些“子类别”中的每一个制作一个表格。 即,一种用于汽车,一种用于 mc,一种用于卡车等,这样就不会通过不需要的信息进行搜索。

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

谢谢

【问题讨论】:

  • 不要这样做。而是依靠适当的索引和优化。

标签: php sql mysql html database


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      性能优化既是一门艺术,也是一门科学,要真正了解什么是最佳选择,您需要进行一些基准测试;鉴于现有信息,任何提供明确答案的人都是错误的。也就是说,对您的情况有一些想法:

      • 你没有说你的类别列现在是什么类型,但如果是字符串类型,它可能比其他选项使用更多的空间,从而使表格更大。正确的索引可以极大地提高速度,但是具有更大索引的更大表总是会适得其反。

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

      • 如果您要处理大量数据,拆分为多个表可以极大地简化备份。

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

      • 如果您要跟踪特定类别的数据,单独的表可以让您更好地规范您的数据库,并且由于使用小得多的表,可能会获得一些不错的性能。

      • 拆分显然意味着修改您的代码。如果您的代码是旧的、古怪的类型,您很可能会从清理中获得性能提升。当然,也有破坏某些东西的风险......

      • 检查您的索引。糟糕的索引是导致性能不佳的一个非常常见的原因,但相对容易修复,只需花费一些高质量的时间进行自学。 MySQL 的 EXPLAIN 可以告诉您查询是否正在使用索引,并且索引统计信息(查看文档)可以告诉您索引的工作效率。

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

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

      【讨论】:

        【解决方案4】:

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

        $query = mysql_query($sql); 而($row = mysql_fetch_assoc($query)){ $临时值[]=$行; }

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

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

        也许mysql不慢,问题出在代码上

        测试不要杀死任何人 =)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-11
          • 2011-01-09
          • 2014-08-02
          • 1970-01-01
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多