Использование ограничения в Mysql. Когда мы используем операторы запроса, нам часто необходимо вернуть первые несколько или средние строки данных. Что нам следует делать в этот момент? Не волнуйтесь, MySQL уже предоставляет нам такую функцию.
SELECT * FROM table LIMIT [смещение,] строк OFFSET смещение |
Предложение LIMIT можно использовать, чтобы заставить оператор SELECT вернуть указанное количество записей. LIMIT принимает один или два числовых аргумента. Параметр должен быть целочисленной константой. Если заданы два параметра, первый параметр указывает смещение первой возвращаемой строки записи, а второй параметр указывает максимальное количество возвращаемых строк записи. Смещение начальной строки записи равно 0 (вместо 1): Для совместимости с PostgreSQL MySQL также поддерживает синтаксис: LIMIT#OFFSET#.
mysql> SELECT * FROM table LIMIT 5,10 // Получение строк записи 6–15;
//Чтобы получить все строки записей от определенного смещения до конца набора записей, вы можете указать -1 в качестве второго параметра:
mysql> SELECT * FROM table LIMIT 95,-1 // Получить 96-последнюю строку записи;
//Если указан только один параметр, это означает возврат максимального количества строк записи:
mysql> SELECT * FROM table LIMIT 5 //Получаем первые 5 строк записи;
//Другими словами, LIMIT n эквивалентно LIMIT 0,n.
Обратите внимание на разницу между пределом 10 и пределом 9,1:
Например:
1.
Выберите * Из циклопедии Где ID>=(
Выберите Макс(ID) Из (
Выберите идентификатор из циклопедии. Упорядочить по лимиту идентификатора 90001.
)Как тмп
) лимит 100;
2.
Выберите * Из циклопедии Где ID>=(
Выберите Макс(ID) Из (
Выберите идентификатор из циклопедии. Упорядочить по лимиту идентификатора 90000,1.
)Как тмп
) лимит 100;
Аналогично, если мы получим следующие 100 записей после 90 000, какая из них будет быстрее: первое предложение или второе предложение?
Первое предложение — сначала взять первые 90 001 записей, взять наибольшее значение идентификатора в качестве начального идентификатора, а затем использовать его для быстрого поиска следующих 100 записей. Второе предложение — взять только последние 90 000 записей, а затем взять остальные. Значение идентификатора Используйте начальную отметку, чтобы найти первое предложение из 100 записей и выполнить 100 строк за набор (0,23) секунды.
Результат выполнения предложения 2100 строк в наборе (0,19) сек.
Фактически, второе предложение можно упростить до:
Выберите * Из циклопедии Где ID>=(
Выберите идентификатор из циклопедии, лимит 90000,1
) лимит 100;
Непосредственно использовать идентификатор 90 000-й записи, минуя операцию Max. Теоретически это должно быть более эффективно, но в реальном использовании эффект практически незаметен, поскольку идентификатор позиционирования возвращает только 1 запись, а Max в этом почти не нуждается. Вы можете получить результат, но писать его так будет яснее и понятнее, избавляя от необходимости рисовать змею.
Выберите Топ-100 * Из циклопедии Где ID>=(
Выберите Топ 90001 Макс.(ID) Из (
Выберите идентификатор из циклопедии. Упорядочить по идентификатору.
)Как тмп
)
Но независимо от того, реализовано ли это в хранимой процедуре или непосредственно в коде, узким местом всегда является то, что TOP MS-SQL всегда возвращает первые N записей. Эта ситуация не особо ощущается, когда объем данных невелик, но если. их сотни или тысячи, эффективность определенно будет низкой. По сравнению с этим ограничение MySQL имеет много преимуществ.
,осуществлять:
Выберите идентификатор из циклопедии, лимит 90000
Выберите идентификатор из циклопедии, лимит 90000,1
Результаты:
90000 строк в наборе (0,36) сек.
1 ряд в наборе (0,06) сек.
MS-SQL может использовать только идентификатор Select Top 90000 из циклопедии. Время выполнения составляет 390 мс, а время выполнения той же операции не так хорошо, как у MySQL 360 мс.
Смещение лимита используется, когда записей больше. Когда записей меньше, смещение меньше, поэтому лучше использовать лимит напрямую. Чем больше смещение, тем лучше последнее.
/////////////////////////////////////////////////// /// ////////////////////////
1. Когда смещение относительно небольшое.
выберите * из лимита посещений yanxue8_10,10
Запустите несколько раз, время остается в пределах 0,0004-0,0005.
Выберите * From yanxue8_visit Где vid >=(
Выбрать видео из yanxue8_visit Упорядочить по лимиту видео 10,1
) лимит 10
Запустите несколько раз, время остается в пределах 0,0005-0,0006, в основном 0,0006.
Вывод: когда смещение смещения небольшое, лучше использовать ограничение напрямую. Это отображение связано с подзапросом.
2. Когда смещение большое.
выберите * из лимита посещений yanxue8_10000,10
Запустите несколько раз, время останется около 0,0187.
Выберите * From yanxue8_visit Где vid >=(
Выбрать видео из yanxue8_visit Упорядочить по лимиту видео 10000,1
) лимит 10
После нескольких прогонов время остается на уровне около 0,0061, что составляет лишь 1/3 от прежнего. Чем больше заданное смещение, тем лучше последнее.
/////////////////////////////////////////////////// /// /////////////////////////////////////////////// /
mysql> SELECT * FROM table LIMIT 95,-1 // Получить 96-последнюю строку записи;
//Если указан только один параметр, это означает возврат максимального количества строк записи
Эта статья взята из блога CSDN. При перепечатке указывайте источник: http://blog.csdn.net/zhqingyun163/archive/2009/12/22/5053579.aspx.