【问题标题】:Best way to search in a table and get results and number of results (MySQL)在表中搜索并获取结果和结果数量的最佳方法(MySQL)
【发布时间】:2010-09-13 20:34:49
【问题描述】:

我有一个“项目”表和一个“项目关键字”表。 当用户搜索关键字时,我想给他一页结果加上结果总数。

我目前正在做的是(对于搜索“a b c”的用户:

SELECT DISTINCT {fields I want} FROM itemkeywords JOIN items   
    WHERE (keyword = 'a' or keyword='b' or keyword='c'
    ORDER BY "my magic criteria"
    LIMIT 20.10

然后我用计数执行相同的查询

SELECT COUNT(*) FROM itemkeywords JOIN items   
    WHERE (keyword = 'a' or keyword='b' or keyword='c'

这可能会得到一个相当大的表,我认为这个解决方案非常糟糕......
但我想不出比这更好的了。

避免两次访问 MySQL 的明显替代方法,即只执行第一个查询,不使用 LIMIT 子句,然后导航到正确的记录以显示相应的页面,然后导航到记录集的末尾以便计数结果似乎更糟……

有什么想法吗?

注意:我使用的是 ASP.Net 和 MySQL,而不是 PHP

【问题讨论】:

  • 在过去的应用程序中,我使用了这两种技术(两个查询和一个没有限制子句的查询),具体取决于我期望的结果数量。我有一个想法(尽管我从未尝试过)正在连接一个几乎相同的子查询以获取计数。那将是 1 个 DB 命中,但仍然有 IO。

标签: asp.net mysql performance search


【解决方案1】:

如果您真的担心性能并且最终需要进行两次查询,您可能需要考虑缓存匹配的总数,因为这不会随着用户浏览结果页面而改变。

【讨论】:

    【解决方案2】:

    您可能会在第一条语句中查看 MySQL SQL_CALC_FOUND_ROWS,然后是第二条语句 SELECT FOUND_ROWS(),这至少可以防止您执行 2 次数据查询,但仍倾向于执行一次整个表扫描。

    请参阅http://dev.mysql.com/doc/refman/5.0/en/select.htmlhttp://dev.mysql.com/doc/refman/5.0/en/information-functions.html

    最好考虑一下:您真的需要这个功能吗?

    【讨论】:

      【解决方案3】:

      你有两个选择:

      MySQL API 应该有一个返回行数的函数。使用较旧的 API 其 mysql_num_rows()。如果您使用的是无缓冲查询,这将不起作用。

      更简单的方法可能是将两个查询结合起来:

      SELECT DISTINCT {fields I want}, count(*) as results 
             FROM itemkeywords JOIN items   
             WHERE (keyword = 'a' or keyword='b' or keyword='c'
             ORDER BY "my magic criteria"
             LIMIT 20.10
      

      我做了一些测试,count(*) 函数不受限制子句的影响。我会先用DESCRIBE 对此进行测试。我不知道这会对您的查询速度产生多大影响。只需要给出前 10 个结果的查询应该比必须找到计数的所有结果的查询要短,然后是前 10 个。但是我在这里可能错了。

      【讨论】:

        【解决方案4】:

        在有限选择中的选择之后添加 SQL_CALC_FOUND_ROWS,然后在第一次选择完成后执行“SELECT FOUND_ROWS()”。

        例子:

        mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
            -> WHERE id > 100 LIMIT 10;
        mysql> SELECT FOUND_ROWS();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-30
          • 1970-01-01
          • 1970-01-01
          • 2017-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多