Используя В или текстовый поиск

Вы не знаете количество строк, пока не обработаете их все. Таким образом, сохраните вывод в буфере и напечатайте его в конце обработки файла:

    #!/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;
    }
}
6
задан nickf 3 November 2008 в 02:33
поделиться

5 ответов

Как всегда с SQL-запросами, выполненными это через профилировщика для обнаружения. Однако мой инстинкт пищеварительного тракта должен был бы сказать, что В поиске будет более быстрым. Espcially в примере, который Вы дали, если бы поле было индексировано, оно должно было бы только сделать 2 поиска. Если Вы сделали подобный поиск, ему, вероятно, придется сделать сканирование, потому что Вы ищете записи, которые заканчиваются определенным значением. Это также было бы более точно ТАК ЖЕ КАК '_points', мог также возвратить 'gpoints' или любую другую подобную строку.

14
ответ дан 8 December 2019 в 16:13
поделиться

Если все элементы данных в столбце рассматриваемый запуск с 'x' или 'y', я не верю В, будет всегда давать Вам лучший запрос. Если это индексируется, как @Kibbee указывает, необходимо будет только выполнить 2 поиска для получения обоих. С другой стороны, если это не индексируется, использование сканирования таблицы В должно будет только проверить первую букву большую часть времени, тогда как с ПОДОБНЫМ это должно будет проверить два символа каждый раз, когда (предполагающий, что все объекты являются по крайней мере 2 символами) - так как первому символу позволяют быть чем-либо.

1
ответ дан 8 December 2019 в 16:13
поделиться

Попробуйте его и посмотрите. Создайте большую сумму данных тестирования, кроме того, попробуйте их и без индекса на myfield. В то время как Вы в нем, посмотрите, существует ли заметное различие между ПОДОБНЫМИ 'точками' и КАК 'xpoint'.

Это зависит от того, что оптимизатор делает с каждым запросом.

Для небольших объемов данных различие будет незначительно. Сделайте, какой бы ни каждый имеет больше смысла. Для больших объемов данных сумма диска ввод-вывод имеет значение намного больше, чем сумма процессорного времени.

Я держу пари, что IN получит Вас лучшие результаты, чем ПОДОБНЫЙ, если будет индекс на myfield. Я также держу пари, что 'xpoint _' работает быстрее, чем '_points'. Но нет ничего как попытка его самостоятельно.

0
ответ дан 8 December 2019 в 16:13
поделиться

MySQL не может использовать индекс при использовании сравнений строк таких ТАК ЖЕ КАК '%foo' или '_foo', но может использовать индекс для сравнений как '% нечто' и 'нечто _'.

Таким образом в Вашем случае, В будет намного быстрее предполагать, что поле индексируется.

Если Вы работаете с ограниченным множеством возможных значений, стоит указать поле как ПЕРЕЧИСЛЕНИЕ - MySQL затем сохранит его внутренне как целое число и сделает этот вид из поиска намного быстрее и сохранит дисковое пространство.

0
ответ дан 8 December 2019 в 16:13
поделиться

Это будет быстрее, чтобы сделать Инверсию, чем ЛЮБИТЬ-ВЕРСИЯ. Особенно то, когда Ваш подстановочный знак не в конце сравнения, но даже при идеальных условиях ВО все еще было бы идеально вплоть до Вашего запроса, приближается к размеру Вашего макс. запроса, вставляют.

0
ответ дан 8 December 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: