26.11.2019

mysql optimization

Задача отображать данные из таблицы которая превышает 100 млн записей. Опции которые нужно проверить. Для отображения последних данных используется скрипт:

  1. Создание индекса НЕ на всю длину,
  2. Создание индексов для двух колонок,
  3. Для уменьшения места можно использовать компрессию для таблицы, сжимает – будь здоров, но потеря в производительности.
  4. Ограничение времени для выполнения конкретного запроса через /*+ MAX_EXECUTION_TIME($TIMEOUT) */  где $TIMEOUT в микросекундах.
  5. Изменение параметров кешей и прочего значимых изменений не дали.
  6. Создание и управление вторым сервером на компьютере для проведения тестирования при помощи mysqld_multi.
  7. create table new like current > rename current to old_tmp, new to current > select into tmp.csv where time > (2 days) > load data from tmp.csv into current > rm csv.

3.08.2019

MySQL ORDER BY / LIMIT performance: late row lookups

Оптимизация запросов, для большой выборки и исключения повторений крайне полезная статья.

вкраце можно использовать вот такую конструкцию:

SELECT  distinctl.id
FROM    (
SELECT  id
FROM    t_limit
WHERE columnA='53'
) o
JOIN    t_limit l
ON      l.id = o.id

11.09.2018

load data local infile не работает

При попытке добавить данные из файла в Mysql 5.5 выдаёт следующее: ERROR 1148 (42000): The used command is not allowed with this MySQL version

Чтобы не вносить изменения в конфигурацию mysql достаточно выполнить команду:

set global local_infile = ‘ON’;

Детали можно почитать в статье.

7.07.2018

mysqldump. без блокировки таблиц.

mysqldump –single-transaction=TRUE

6.07.2018

Mysql. Оптимизация. SHM. Error permission denied

Столкнулся с тем что Mysql пишет очень много на диск, работает в связке с Django.
Решил подключить /run/shm в качестве временного каталога, а он не подключается – “permission denied error 13”.

Оказалось всё просто, оказалось я использую apparmor(вероятно шел с дистрибутивом) вот тут инструкция.

28.03.2018

Репликация таблиц в postgres 9.5 и выше

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

итак, описание установки исключительно полезное и находится здесь:

Моя задача состояла в том, что есть основная база данных постгрес к которой подключаются астериски, и используют ее для realtime, но не только, еще и скрипты на этих астерисках спрашивают при каждом звонке информацию о балансах, маршрутах, стоимости звонков.

А поскольку астерисков много а БД одна и еще находится далеко поэтому network latency > 120ms. поэтому я создал кеширующий несколько таблиц сервер. скорость репликации отличная, проблем не замечено.

6.11.2014

Mysql. With recursive. Суммировать результаты запроса. Having.

Привет,  давеча обнаружил что в таблице со звонками есть двойные звонки. Соответственно возникают две задачи:

1. Удалить дублирующися записи (легко),

2. Делать выборку без дублирующихся записей (легко),

3. Посчитать сумму звонков в продублированных записях. (интересно).

 

1 и 2 я опущу, это не интересно. А вот третий пункт делается так:

with recursive mytable as (select max(duration) from acc where time > ‘2014-08-01 00:00:00’ and srcip like ‘ip address’ and duration > 0 group by callid having count(callid) > 1) select sum(max) from mytable;

но это не включает секунды третьего звонка которые тоже есть.

создадим темповою табличку для экспериментов:

create temporary table acc2 as (select * from acc order by time desc limit 1000);

yooxy# delete from acc3 where id in (select max(id) from acc3 where time > ‘2014-08-01 00:00:00’ and srcip like ‘address’ and duration > 0 group by callid having count(callid) > 1);
DELETE 224
yooxy_1711=# delete from acc3 where id in (select max(id) from acc3 where time > ‘2014-08-01 00:00:00’ and srcip like ‘address’ and duration > 0 group by callid having count(callid) > 1);
DELETE 27
yooxy_1711=# delete from acc3 where id in (select max(id) from acc3 where time > ‘2014-08-01 00:00:00’ and srcip like ‘address’ and duration > 0 group by callid having count(callid) > 1);

DELETE 0.

правда это вручную, зато все под контролем. ну и удалим таблицу.

drop table acc2.

 

11.09.2012

Аналитика занятости линий для БД

Скриптик для анализа одновременного занятия линий.

Суть простая выбираем промежуток когда считаываем кол-во звонков, например каждые 5 минут начиная с 2012-09-01. И смотрим какие звонки к какому промежутку относятся. на выходе пара: время – кол-во линий.

Играя SQL запросами можно получить статистику по каналу или по префиксу, вообщем инструмент нужный, но данная реализация крайне медленная. Времени на разработку совсем нет, а решение принимать хочется на основании конкретных данных.

#!/usr/bin/perl

use strict;
use DBI;
use Time::Local;
use Date::Parse;

my $dbh = DBI->connect(‘dbi:Pg:database=yooxy’, ‘pavel’,”) or die $DBI::errstr;

#get all calls
my $date_start = ‘2012-09-09 00:00:00’;

my $leg = 300; #in seconds
my $calls_query = ‘select time,duration from acc where time > \”.$date_start.’\’;’;
my $sth = $dbh->prepare($calls_query);
$sth->execute;
my $ary_ref = $sth->fetchall_arrayref;

my $start_time = str2time($date_start);
my $a;
my $i,my $i2;
my %values;
$dbh->disconnect;
foreach ($a=$start_time;$a = $a + $leg;) {
$i2++;
foreach (@$ary_ref) {
$i++;
my $date1 = $_->[0];
my $duration = 60;# $_->[1];
my $line = $a;

my $start = str2time($date1);
my $end = str2time($date1) + $duration;

if (($line > $start) and ($line < $end)) { print “o$start < $line < $end\n”; $values{$a}++};

}

if ($values{$a} > 0) {print scalar(localtime($a)),”;”,$values{$a},”\n”;} else {print scalar(localtime($a)),”;”,0,”\n”;

};

last if $a > time();
}
print “\ncalls $i2; iter $i;”;