【问题标题】:MySQL and PaginationMySQL 和分页
【发布时间】:2017-04-18 08:59:25
【问题描述】:

下面是名为list的表:

 Column Name   Data Type
   id             (Int)     
   user_one     (String)    
   user_two     (String)

我想扫描user_oneuser_two column 中的用户。

作为回报,我想取回前 100 条记录和一个表明还有更多记录的标志。

解决方案 #1:

ALTER TABLE list ADD FULLTEXT KEY `full_name` (`user_one`,`user_two`);
SELECT * FROM list WHERE MATCH(user_one, user_two) AGAINST ('john');

我相信解决方案 1 的性能会更好,但我不确定如何添加 100 的 limit 并获得 flag

解决方案 #2:

SELECT * FROM list 
WHERE "john" LIKE Concat(Concat('%',user_one),'%') 
OR "john" LIKE  Concat(Concat('%',user_two),'%')
ORDER BY id
LIMIT 50

我认为解决方案 #2 比较慢,如果记录超过 100 条,我不知道添加 flag 的最佳方法是什么。

最后,如果可能的话,我想尽量减少整个表扫描。

【问题讨论】:

    标签: mysql sql database-design pagination relational-database


    【解决方案1】:

    1) 你可以得到 101 行并且只使用 100。如果你的数组大于 100,则必须有更多行

    SELECT * FROM list WHERE MATCH(user_one, user_two) AGAINST ('john') LIMIT 101;
    

    2) 在查询中使用 SQL_CALC_FOUND_ROWS

    SELECT SQL_CALC_FOUND_ROWS * FROM list WHERE MATCH(user_one, user_two) AGAINST ('john') LIMIT 100;
    
    SELECT FOUND_ROWS();
    

    Get total number of rows when using LIMIT?

    【讨论】:

    • 谢谢。在找到 101/100 records 后,这些是否停止扫描 table
    • 如果没有ORDER BY,您将获得一些随机的 101/100 行。第二批可能会重叠/跳过。 More on pagination.
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2011-07-18
    相关资源
    最近更新 更多