Вы не знаете количество строк, пока не обработаете их все. Таким образом, сохраните вывод в буфере и напечатайте его в конце обработки файла:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
open my $fh, '<', 'log' or die $!;
my @buffer;
while (<$fh>) {
next if $. < 3;
if (/^([0-9]+) rows selected\.$/) {
die "Wrong number of rows reported: $1, seen ", scalar @buffer
if $1 != @buffer;
} else {
push @buffer, [ split ' ' ];
}
}
for (@buffer) {
say join "\t", @ Вы не знаете количество строк, пока не обработаете их все. Таким образом, сохраните вывод в буфере и напечатайте его в конце обработки файла:
[110] или обработайте файл дважды. В первом запуске просто посчитайте строки, во втором напечатайте их одну за другой, добавив счет:
open my $fh, '<', 'log' or die $!;
1 while <$fh>;
my $size = $. - 3;
seek $fh, $. = 0, 0;
while (<$fh>) {
next if $. < 3;
if (/^([0-9]+) rows selected\.$/) {
die "Wrong number of rows reported: $1, seen ", $size
if $1 != $size;
} else {
say join "\t", split(' '), $size;
}
}
, scalar @buffer;
}
или обработайте файл дважды. В первом запуске просто посчитайте строки, во втором напечатайте их одну за другой, добавив счет:
open my $fh, '<', 'log' or die $!;
1 while <$fh>;
my $size = $. - 3;
seek $fh, $. = 0, 0;
while (<$fh>) {
next if $. < 3;
if (/^([0-9]+) rows selected\.$/) {
die "Wrong number of rows reported: $1, seen ", $size
if $1 != $size;
} else {
say join "\t", split(' '), $size;
}
}
Как всегда с SQL-запросами, выполненными это через профилировщика для обнаружения. Однако мой инстинкт пищеварительного тракта должен был бы сказать, что В поиске будет более быстрым. Espcially в примере, который Вы дали, если бы поле было индексировано, оно должно было бы только сделать 2 поиска. Если Вы сделали подобный поиск, ему, вероятно, придется сделать сканирование, потому что Вы ищете записи, которые заканчиваются определенным значением. Это также было бы более точно ТАК ЖЕ КАК '_points', мог также возвратить 'gpoints' или любую другую подобную строку.
Если все элементы данных в столбце рассматриваемый запуск с 'x' или 'y', я не верю В, будет всегда давать Вам лучший запрос. Если это индексируется, как @Kibbee указывает, необходимо будет только выполнить 2 поиска для получения обоих. С другой стороны, если это не индексируется, использование сканирования таблицы В должно будет только проверить первую букву большую часть времени, тогда как с ПОДОБНЫМ это должно будет проверить два символа каждый раз, когда (предполагающий, что все объекты являются по крайней мере 2 символами) - так как первому символу позволяют быть чем-либо.
Попробуйте его и посмотрите. Создайте большую сумму данных тестирования, кроме того, попробуйте их и без индекса на myfield. В то время как Вы в нем, посмотрите, существует ли заметное различие между ПОДОБНЫМИ 'точками' и КАК 'xpoint'.
Это зависит от того, что оптимизатор делает с каждым запросом.
Для небольших объемов данных различие будет незначительно. Сделайте, какой бы ни каждый имеет больше смысла. Для больших объемов данных сумма диска ввод-вывод имеет значение намного больше, чем сумма процессорного времени.
Я держу пари, что IN получит Вас лучшие результаты, чем ПОДОБНЫЙ, если будет индекс на myfield. Я также держу пари, что 'xpoint _' работает быстрее, чем '_points'. Но нет ничего как попытка его самостоятельно.
MySQL не может использовать индекс при использовании сравнений строк таких ТАК ЖЕ КАК '%foo' или '_foo', но может использовать индекс для сравнений как '% нечто' и 'нечто _'.
Таким образом в Вашем случае, В будет намного быстрее предполагать, что поле индексируется.
Если Вы работаете с ограниченным множеством возможных значений, стоит указать поле как ПЕРЕЧИСЛЕНИЕ - MySQL затем сохранит его внутренне как целое число и сделает этот вид из поиска намного быстрее и сохранит дисковое пространство.
Это будет быстрее, чтобы сделать Инверсию, чем ЛЮБИТЬ-ВЕРСИЯ. Особенно то, когда Ваш подстановочный знак не в конце сравнения, но даже при идеальных условиях ВО все еще было бы идеально вплоть до Вашего запроса, приближается к размеру Вашего макс. запроса, вставляют.