Выбрать несколько записей из одной таблицы

Vin-Diesel

Новичок
Есть таблица:
id INT | text TEXT
Есть данные, порядка 50-100 тысяч строк.

Необходимо выбрать, к примеру 10, записей, которые находятся в разных частях таблицы:
132 запись, 156 запись, 19402 запись, ..., 49353 запись.

Как подходить к этому? Десять запросов с UNION работают очень долго.
Пробовал вместо TEXT столбца ставить CHAR - также долго, т.е. похоже статика тут не учитывается
 

Vin-Diesel

Новичок
Запрос:
(SELECT * LIMIT 132, 1) UNION (SELECT * LIMIT 156, 1) UNION (SELECT * LIMIT 15156, 1) UNION ...

where ID IN (132, 156, 19402, ..., 49353)
Нужно выбрать запись, которая в таблице, к примеру сотая. Т.е. ID при этом может быть 200 (200 записей вставили, 100 записей удалили)

Я думаю у него что-то вроде
(SELECT ... LIMIT 132, 1) UNION (SELECT ... LIMIT 156, 1) UNION ...
Да совершенно верно:)
 

Vin-Diesel

Новичок
Зачем это нужно?
Записи в таблице имеют коэффициент вероятности выдачи от 0,01 до 1
Группировкой по коэффициенту получаем количество записей с определенным коэффициентом
Далее нехитрой формулой получаем диапазон для случайного значения, к примеру от 0 до 10
После скрипт генерирует случайное число в этом диапазоне и преобразует его к порядковому номеру в таблице
После эта выборка
 

Vin-Diesel

Новичок
Ещё раз, - покажите запрос. Реальный запрос, который Вы использовали, а не идею.
И структуру таблицы. Реальную.
Её нет, я проектирую. И прошу совета..
Если использовать конструкцию с LIMIT, он по идее не должен бежать по всей таблице, там же только два числа посчитать и считать нужный сектор данных.
 

флоппик

promotor fidei
Команда форума
Партнер клуба

Vin-Diesel

Новичок
Структура другая, но от этого смысл не меняется)

CREATE TABLE IF NOT EXISTS `ip2country` (
`id` int(10) unsigned NOT NULL auto_increment,
`begin_ip` varchar(20) default NULL,
`end_ip` varchar(20) default NULL,
`begin_ip_num` int(11) unsigned default NULL,
`end_ip_num` int(11) unsigned default NULL,
`country_code` varchar(3) default NULL,
`country_name` varchar(150) default NULL,
PRIMARY KEY (`id`),
KEY `begin_ip_num` (`begin_ip_num`,`end_ip_num`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=158625 ;

Решил я проблему...
Изначально было так:
SELECT * LIMIT 132, 1 UNION SELECT * LIMIT 156, 1 UNION SELECT * LIMIT 15156, 1
и СУБД похоже просматривала всю таблицу N-ое количество раз...
Решил как подсказали:
(SELECT * LIMIT 132, 1) UNION (SELECT * LIMIT 156, 1) UNION (SELECT * LIMIT 15156, 1)

Всем спасибо:)
 

Vin-Diesel

Новичок
Меняется. И от того, каков был реальный запрос тоже меняется.
Но раз задача решена, то всё OK.
Тут наверное больше незнание запросов с UNION. В самом начале я как-то не придал значения тому, что в результате только одна запись.
Невнимательность.. периодически проявляется.. причина этому похоже усталость:)

Да, реальный запрос был к приведенной таблице:
SELECT * FROM ip2country LIMIT 100, 1 UNION SELECT * FROM ip2country LIMIT 100000, 1
 

Vin-Diesel

Новичок
Естественно неправильно (см. доку UNION+LIMIT).
Ради интереса попытал запрос с UNION на таблице в 1М записей, длина строки 90 байт - выборка 10 записей в диапазоне от 0 до 50000 идёт ~0,06 сек на ядре в 2.6 Гц. Это "очень долго" для Вас?
Ну я про неправильный писал, он долгий:) А правильный, работает шустро - как вы и написали ~0,06 сек
 
Сверху