mysql optimization
Задача отображать данные из таблицы которая превышает 100 млн записей. Опции которые нужно проверить. Для отображения последних данных используется скрипт:
- Создание индекса НЕ на всю длину,
- Создание индексов для двух колонок,
- Для уменьшения места можно использовать компрессию для таблицы, сжимает – будь здоров, но потеря в производительности.
- Ограничение времени для выполнения конкретного запроса через /*+ MAX_EXECUTION_TIME($TIMEOUT) */ где $TIMEOUT в микросекундах.
- Изменение параметров кешей и прочего значимых изменений не дали.
- Создание и управление вторым сервером на компьютере для проведения тестирования при помощи mysqld_multi.
- 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.
MySQL ORDER BY / LIMIT performance: late row lookups
Оптимизация запросов, для большой выборки и исключения повторений крайне полезная статья.
вкраце можно использовать вот такую конструкцию:
11.09.2018SELECT
distinctl.id
FROM
(
SELECT
id
FROM
t_limit
WHERE columnA='53') o
JOIN
t_limit l
ON
l.id = o.id
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’;
Детали можно почитать в статье.
| Posted in SQL запросы, Проблемы при настройке | No Comments »
mysqldump. без блокировки таблиц.
mysqldump –single-transaction=TRUE
| Posted in SQL запросы, Готовые решения | No Comments »
Mysql. Оптимизация. SHM. Error permission denied
Столкнулся с тем что Mysql пишет очень много на диск, работает в связке с Django.
Решил подключить /run/shm в качестве временного каталога, а он не подключается – “permission denied error 13”.
Оказалось всё просто, оказалось я использую apparmor(вероятно шел с дистрибутивом) вот тут инструкция.
| Posted in SQL запросы, Без рубрики, Проблемы при настройке | No Comments »
Репликация таблиц в postgres 9.5 и выше
Для репликации таблиц в постгресе я использовал pglogical, который на первый взгляд может показаться не нужной надстройкой в вопросе репликации.
Однако, в процессе сравнения инструментов для репликации а, также при попытки реализовать её, я обнаружил, что pglogical очень простой способ реплицировать несколько таблиц в базе данных постгрес.
итак, описание установки исключительно полезное и находится здесь:
Моя задача состояла в том, что есть основная база данных постгрес к которой подключаются астериски, и используют ее для realtime, но не только, еще и скрипты на этих астерисках спрашивают при каждом звонке информацию о балансах, маршрутах, стоимости звонков.
А поскольку астерисков много а БД одна и еще находится далеко поэтому network latency > 120ms. поэтому я создал кеширующий несколько таблиц сервер. скорость репликации отличная, проблем не замечено.
| Posted in SQL запросы, Готовые решения | No Comments »
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;”;
| Posted in SQL запросы | No Comments »