2014-10-17 2 views
0

Я пытаюсь найти первую запись в нашей огромной базе данных, где «Foo» первый начал появляться, но этот запрос слишком медленно:Как проверить каждую N-ю запись в базе данных mysql?

select min(id) 
from mytable 
where data like '%foo%'; 

Я был бы счастлив, чтобы рассчитывать на миллионы, чтобы получить достаточно близко , но этот запрос, кажется, не работать быстрее:

select min(id) 
from mytable 
where mod(id, 1000000) = 0 
and data like '%foo%'; 

Любая идея, как получить MySQL только проверить каждую миллионную запись? Единственным, что я могу думать о том, чтобы иметь временную таблицу с первыми числами и присоединение на то, умножая каждое целое число от 1000000.

+2

_ «Любая идея, как заставить mysql проверять каждую миллионную запись?» _ - этот вопрос подразумевает, что вы делаете что-то неправильно даже до этого момента. Вы должны (при нормальных обстоятельствах) никогда не нуждаться в таком подходе, когда вы указываете базе данных _where_ (или как) она должна искать себя. Скорее всего, эту проблему можно исправить, используя правильные индексы. (Хотя поиск подстановочных знаков с 'like '% foo%'', конечно, проблематичен по самой своей природе, и индекс в этом столбце, скорее всего, не исправит этого. Но и попытки попытаться вмешаться в то, как выполняется поиск самостоятельно.) – CBroe

+0

Данные слишком велики для индексации, особенно для моего одного запроса. –

+0

можно было бы вычислить id каждой n-й строки и получить эту строку, а затем проверить данные в ней? Он будет очень быстрым, так как он будет искать индекс. –

ответ

0

Вашего второго запроса, скорее всего, работают медленнее из-за добавленный mod(id, 1000000) = 0, что MySQL должен проверьте для каждого id, что он находит.

Для того, чтобы это ускорилось, у вас должен быть указатель на колонке data.

Кроме того, использование LIMIT, вероятно, поможет вам выглядеть примерно так:

select min(id) 
from mytable 
where data like '%foo%' 
order by id 
limit 0,1000000 

Это будет искать только первые 0 - 100000 строк. Если вы не найдете то, что хотите, увеличьте предел - 1000000, 2000000, чтобы посмотреть только 1000000 - 2000000 строк.

+0

Спасибо, но я хочу проверить каждую миллионную строку, а не миллион за раз. –

+0

затем измените предел соответственно. В вашем случае измените его на '999999,1000000' и ​​соответствующим образом компенсируйте. 'limit' - ваш друг. Я думаю, что это гораздо лучшее решение, чем 'где mod (id, 1000000) = 0' как' где mod (id, 1000000) = 0' заставляет вычислять на * каждый * 'id' – mmcrae

+0

на второй взгляд, нет. Вы не хотите проверять каждую миллионную строку, не так ли? Это предполагает, что на миллионной строке вы найдете свои данные. У вас нет причин предполагать это. – mmcrae

Смежные вопросы