А что Вас тут удивляет? Все 77 книг Библии делятся на канонические (т. е. продиктованные богом) и неканонические (все остальные). Евангиелие, как жизнеописание, написанное учениками — неканоническая книга по определению.
И что Вам забавно? то что я признал свою неправоту? Тут так не принято?
Ну чтож… попытался упростить ответ, получилось плохо… Если Вам так нужно, могу привести решение без упрощения.
Итак.
У нас есть таблица, скажем prices,
create table goods (ix int auto_increment primary key, cost integer);
И есть составной индекс
create index ix1 (cost,ix)
У нас есть страница, в которой в hidden полях есть pkey и cost последней записи и этой страницы. Скажем они будут в переменных $ix и $cost когда пользователь тыркнет кнопку next.
При отрисовке страницы первая запись будет
handler goods open;
handler goods read ix1 = ($cost,$ix);
следующие N записей (длина страницы N+1)
handler goods read ix1 next limit $N;
handler goods close;
У последней записи естественно ix и cost сохраняем в hidden полях.
explain… А заодно slow query log. И еще show status. А так же show variables. И если Вы понимаете, что там написано, во всех этих местах, то скорее всего сможете найти быстрый способ выборки данных
(цитата)
— select * from table where id in (select id from table order by rand()) limit 1,
вот это выполнится перфектно при условии что ид = первичный ключ, поспорите? ;)
(/цитаты)
Поспорю.
order by rand приведет к тому, что оптимизатор даже не сообразит, какой индекс можно использовать. То есть он выберет filesort, temporary file для вычисления списка id-ов в случайном порядке в сабселекте…
далее сервер соберет резултсет из всех записей (поскольку все id есть в разультатах сабселекта) и затем первая строка из него (limit 1) будет возвращена пользователю.
Ну ясное дело что по первичному ключу лучше. Только
1) нет гарантии что вы выберите именно 19 значений, как Вы предолагаете
2) Нет гарантии, что в записи где $start = 1000 000, и первичный ключ тоже = 1 000 000
Вообще, если речь идет об выборке по страницам, я бы предпочел в hidden полях хранить граничные значения первичного ключа для этой страницы, а при переходе (скажем) на след. страницу, делать
select что_надо from таблица where keyfield>сохраненныйпервичныйключ limit 20;
если запрос на insert/delete/update то query cache в любом случае по барабану. Так что выигрыш от prepared statements может быть заметным, начиная, если мне не изменяет склероз, с 4.1.
другое дело что некоторые клиенсткие бибки работают (как это будет по русски) коряво с prepared statements. Можно на засаду нарваться.
1) Использование разных (изначально лживых) источников чтобы выуживать информацию — это не свобода слова. Это технология, как получить информацию _без_ свободы слова.
2) Ваша ошибка в том, что вы верите, что сможете получить правду, читая лживые, но разные источники. Полную информацию вы все равно не получите.
Не о том речь. Есть несколько крупных групп, у которых свои интересы, и которые борятся за власть.
У этих групп свои СМИ. Если вы хотите что-то опубликовать, это должно отражать интересы хотя бы одной из этих групп… Если не отражает — то вы просто не найдете издание чтобы опубликовать свою статью. Потому что издания не будут публиковать статьи в которых не заинтересованы их хозяева.(Ну разве что организуете свою газету, опять же с проблематичным тиражем)
Таким образом публикуя статью, вы выражаете интересы не народа. Не свободы. А одной из этих групп.
Вы можете выбирать кому продаться, но свободой слова это не назвать.
Ну чтож… попытался упростить ответ, получилось плохо… Если Вам так нужно, могу привести решение без упрощения.
Итак.
У нас есть таблица, скажем prices,
create table goods (ix int auto_increment primary key, cost integer);
И есть составной индекс
create index ix1 (cost,ix)
У нас есть страница, в которой в hidden полях есть pkey и cost последней записи и этой страницы. Скажем они будут в переменных $ix и $cost когда пользователь тыркнет кнопку next.
При отрисовке страницы первая запись будет
handler goods open;
handler goods read ix1 = ($cost,$ix);
следующие N записей (длина страницы N+1)
handler goods read ix1 next limit $N;
handler goods close;
У последней записи естественно ix и cost сохраняем в hidden полях.
Интересно, а Вас то какое решение?
А насчет 3 страниц с ценой — если поле не уникально, используйте
where цена >= граничное_значение_цены and pkey >граничное_значение_pkey order by цена, pkey
Мне кажется это очевидно…
Переключили сортировку, значит прсто от другого ключа танцуем…
LAST_INSERT_ID()… LAST_INSERT_ID()+ROW_COUNT()
— select * from table where id in (select id from table order by rand()) limit 1,
вот это выполнится перфектно при условии что ид = первичный ключ, поспорите? ;)
(/цитаты)
Поспорю.
order by rand приведет к тому, что оптимизатор даже не сообразит, какой индекс можно использовать. То есть он выберет filesort, temporary file для вычисления списка id-ов в случайном порядке в сабселекте…
далее сервер соберет резултсет из всех записей (поскольку все id есть в разультатах сабселекта) и затем первая строка из него (limit 1) будет возвращена пользователю.
Не слишком похоже на оптимальный план.
1) нет гарантии что вы выберите именно 19 значений, как Вы предолагаете
2) Нет гарантии, что в записи где $start = 1000 000, и первичный ключ тоже = 1 000 000
Вообще, если речь идет об выборке по страницам, я бы предпочел в hidden полях хранить граничные значения первичного ключа для этой страницы, а при переходе (скажем) на след. страницу, делать
select что_надо from таблица where keyfield>сохраненныйпервичныйключ limit 20;
другое дело что некоторые клиенсткие бибки работают (как это будет по русски) коряво с prepared statements. Можно на засаду нарваться.
2) Ваша ошибка в том, что вы верите, что сможете получить правду, читая лживые, но разные источники. Полную информацию вы все равно не получите.
У этих групп свои СМИ. Если вы хотите что-то опубликовать, это должно отражать интересы хотя бы одной из этих групп… Если не отражает — то вы просто не найдете издание чтобы опубликовать свою статью. Потому что издания не будут публиковать статьи в которых не заинтересованы их хозяева.(Ну разве что организуете свою газету, опять же с проблематичным тиражем)
Таким образом публикуя статью, вы выражаете интересы не народа. Не свободы. А одной из этих групп.
Вы можете выбирать кому продаться, но свободой слова это не назвать.