Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.05.2011, 23:12
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Перемешать данные в таблице
В БД MySQl имеется таблица состоящая из 1 столбца/поля `word` varchar(60) NOT NULL, на этом столбце стоит стоит первичный ключ.
В таблице 12млн записей.
Не могу придумать оптимального решения для того, чтобы вытащить случайную запись. Т.к. таблица большая, то ORDER BY RAND очень и очень долго выполняется.
Попробовал еще таким способом: SELECT `word` FROM `words` LIMIT N, 1, где N - случайное число от 0 до 12млн. Подобный запрос выполняется за 8 секунд, что так же меня не устраивает.

Как вариант вижу создание дополнительного столбца наполненного случайными числами от 0 до 12 млн. А после сортировать поле по возрастанию, и брать по 1 записи с начала и удалять её после обработки.

Есть ли какие-то идеи/советы как решить задачку оптимальнее?
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #2 (permalink)  
Старый 14.05.2011, 23:51
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

не знаю на сколько быстрей, но как-то так:
$query = mysql_query("SELECT * FROM words");
$id = rand(1, mysql_num_rows($query));
$sql = "SELECT word FROM words WHERE id=$id";
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2011, 18:18
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

monolithed,
Если бы у меня была бы колонка id то проблем бы не было. Если мы добавляем колонку с id то нам необходимо её сделать первичным ключом. При этом мы потеряем скорость при поиске по колонке word, причем не просто потеряем, а у нас полностью пропадет данная возможность (т.к. ставя даже ключ UNIQUE время поиска превысило 30 секунд). Хотя для других реализаций ваш способ вполне подходит, только важно поддерживать отсутствие дыр в индексе id.

Вариант с добавлением колонки со случайным числом тоже не дал никаких результатов. Даже после установки индекса на эту колонку, время запроса с сортировкой по этой колонке составляет более 10 секунд.
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн

Последний раз редактировалось greatilya, 15.05.2011 в 19:31.
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2011, 20:02
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

greatilya,
правильно организовать базу данных.на текст вешать первичный ключ и по нему поиск-круто...хотя бы изза того что поиск по тексту самый медленный .файл текстовый и то быстрее будет работать-сместиться на строку н и считать её....
не правильная организация бд. перебор всего..... многотабличность как вариант чтоб ключи все не ковырять и вложенные запросы...и всё равно столбец с номером ускорит поиск
Ответить с цитированием
  #5 (permalink)  
Старый 16.05.2011, 12:38
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

т.е. PRIMARY KEY(word) - нормально, а UNIQUE(word) - больше 30 сек?
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2011, 13:43
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Сообщение от x-yuri
т.е. PRIMARY KEY(word) - нормально, а UNIQUE(word) - больше 30 сек?
Ну да, только правда при LIKE, без %.

Нашел решение ситуации, распишу поэтапно:
1) убрал PRIMARY KEY с word
2) добавил колонку id AUTOINCREMENT PRIMARY KEY
3) убрал PRIMARY KEY с id
4) поставил PRIMARY KEY на word
5) поставил UNIQUE на id
Итого получилась таблица, где все слова пронумерованы с 1 до 12млн. Теперь для поиска случайного слова мы берем случайное число от 1 до 12млн и вот у нас id нужной записи. При ключе UNIQUE на id поиск достаточно быстрый. Остается только следить за отсутствием дыр в нумерации id.

Если я где-то ошибся в структуре, оптимизации или еще в чем-то, то просьба меня поправить.
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн

Последний раз редактировалось greatilya, 16.05.2011 в 13:46.
Ответить с цитированием
  #7 (permalink)  
Старый 16.05.2011, 20:50
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Я в этом пока слабо разбираюсь, чтобы советовать, но, возможно, при таких обьемах стоит подумать в сторону nosql-решений (mongodb, cassandra, couchdb).
Ответить с цитированием
  #8 (permalink)  
Старый 18.05.2011, 09:02
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

x-yuri,
ну то решение к которому я пришел вполне получилось оптимизированным. Задача не настолько существенная чтобы воротить туда разнообразные навороченности.
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
  #9 (permalink)  
Старый 18.05.2011, 17:50
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

я считаю, что навороченность - это оптимизация, в отличие от использования более подходящих инструментов. Но деталей проекта я не знаю, поэтому сложно что-то сказать
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контекстное меню как считать данные из таблицы xela1980 jQuery 25 31.05.2013 14:20
WYMeditor: не отправляются данные на сервер Ticksy jQuery 0 04.01.2011 21:45
Не совсем обычный фрейм и выезжающий текст при наводе на картинку. amaz245 Элементы интерфейса 35 25.12.2010 17:29
Отправить данные с контейнера (XMLHttpRequest) vladikas Библиотеки/Тулкиты/Фреймворки 7 26.11.2010 17:47
Изменение цвета ячейки в таблице, при наведении на строку другой таблицы Psychosonic Общие вопросы Javascript 12 24.11.2010 16:44