2016-12-03 2 views
-2

Ниже приводится таблица называется list:MySQL и Pagination

id(Int)

user_one(String)

user_two(String)

Я хотел бы, чтобы сканировать для пользователя в user_one и user_twocolumn.

В ответ я хотел бы вернуть первые 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 будет работать лучше, но я не уверен, как добавить limit из 100 и получить 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 медленнее, и я не знаю, что это лучший способ, чтобы добавить flag, если есть более чем 100 записей.

Последнее, если возможно, я хотел бы свести к минимуму все сканирование таблицы.

ответ

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?

+0

Спасибо. Неужели эти стоп сканируют «таблицу» после 101/100 'записей'? – user1107173

+2

Без 'ORDER BY' вы получите несколько случайных строк 101/100. И вторая партия может перекрываться/пропускаться. [Больше всего в pagination_] (http://mysql.rjweb.org/doc.php/pagination). –