Quote from: AKots at Aug 25, 2009, 03:06 AM
Кодировку в сообщении исправьте. И третий вариант однозначно не подходит - если документы удалялись, некоторых ID может просто не существовать. Вообще, вряд ли придумаете что-то оптимальней первого варианта.
Кодировку вроде поправил.Прошу прощения. Опера почему то глюкает на этом форуме.
А где, простите, в третьем варианте я использовал ID? Насколько я понимаю LIMIT считает строчки сам, без использования ID...
Плюсы данного метода очевидны. в первом запросе используется служебная информация, и запрос выполняется практически мгновенно возвращая массив с единственным числовым элементом, второй запрос чуть тяжелее, но все равно лишь получает n строк таблицы и очень шустр.
http://www.rldp.ru/mysql/mysqladm/glava05.htm
5.2.4 Как MySQL оптимизирует предложение WHERE
COUNT(*) на одиночной таблице без WHERE получен непосредственно из информации таблицы.
Единственный минус в том, что получаются n-строк подряд, и если нужны совсем разные строки то лучше использовать второй вариант.
Первый вариант однозначно неприемлем, попробуйте замерить время его выполнения на своей тестовой базе из 30 тыс. документов. Я думаю неприятно удивитесь. Я пробовал на "детской" базе из 60 документов:
1.SELECT * FROM modx_site_content ORDER BY RAND() LIMIT 2 запрос занял 0.1185 сек
2.SELECT count(*) AS count FROM modx_site_content запрос занял 0.0 сек.
3. SELECT * FROM modx_site_content LIMIT 10 , 2 запрос занял 0.0072 сек.
Экономия, даже на таком кол-ве документов заметная. А ведь в третьем запросе даже звездочка не нужна, можно прописать нужные поля.