piątek, 30 grudnia 2011

wtorek, 27 grudnia 2011

Vim commenting

Jak zakomentować zaznaczony tekst w vimie ?

1.ctrl+v (tryb visual)
2.j lub down arrow zaznaczamy text
3.shift+i (tryb insert)
4.wpisuje dowolny znak (w tym przypadku #)
5.klepiemy dwa razy [Esc]
6.Tada ! ; )

poniedziałek, 26 grudnia 2011

Mysql Events

Kiedys o tym slyszalem ale ucichlo.
Nie mniej temat dobrze rokuje a zatem :
Pierw configuracja :
SET GLOBAL event_scheduler = 1/0 (ON/OFF)

Mozna tez dopisac na stałe do configu.

Tabela testowa:
CREATE TABLE zdarzenia_test (
  id int(10) NOT NULL AUTO_INCREMENT,
  data timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM

oraz event który będzie wrzucał co 10s wpis :
CREATE EVENT event_first_test ON SCHEDULE EVERY 10 SECOND DO insert into zdarzenia_set set data=now()
wszystko smiga :
mysql> select * from zdarzenia_test order by data desc limit 3;
+-----+---------------------+
| id  | data                |
+-----+---------------------+
| 209 | 2011-12-26 12:22:53 |
| 208 | 2011-12-26 12:22:43 |
| 207 | 2011-12-26 12:22:33 |
+-----+---------------------+
3 rows in set (0.00 sec)


Dobra ale co gdy jakaś akcja się nie uda ?
mysql> drop table zdarzenia_test;
Query OK, 0 rows affected (0.00 sec)
Informacja idzie do error loga :
111226 12:24:33 [ERROR] Event Scheduler: [root@localhost][test.event_first_test] Table 'test.zdarzenia_test' doesn't exist
111226 12:24:33 [Note] Event Scheduler: [root@localhost].[test.event_first_test] event execution failed.
Wszystko fajnie tyle, tylko pewnie nie kazdy lubi sobie czytac error loga wieczorami; )
Zdecydowanie brakuje jakieś możliwosci w stylu wyslij maila (cos na wzor schedule'ra w MSSQL).
Oczywiscie mozemy sobie to jakos obsluzyc skryptowo ale przydałaby sie jakas funkcja systemowa.
Nie mniej jednak sam feature jest dosyc fajny. Nie sadze, zeby szybko zastąpił skrypt w cronie jednak do przeliczania
nie krytycznych danych,czyszczenia tabel nadaje się idealnie.
Oczywiscie to tylko zarys. Istnieje dużo więcej możliwosci konfiguracji (data startu,zakonczenia etc)
Zachęcam do lektury ; )
http://dev.mysql.com/doc/refman/5.1/en/alter-event.html

czwartek, 22 grudnia 2011

mysql to csv

Zawsze zapominam:
select m.kierunkowy,p.prefix,vn.callerid,vn.typ 
INTO OUTFILE '/tmp/numery.csv' 
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
from s3_oss.voip_numery vn 
join s3_oss.prefix p on (p.prefix=vn.prefix) 
join s3_teren.miasta m on (m.id_miasta=p.id_miasta) 
where p.id_miasta=9 and p.aktywny=1 and p.typ_prefixu='normalne' and p.id_typu_numeru=1 
order by vn.callerid;

środa, 21 grudnia 2011

mysql views

Jak sprawdzic kto ma prawa do danej procedury, tabeli w mysql ?
Ano tak :

dla tabelki:
select * from mysql.tables_priv where Table_name='vip';


dla kolumny :
select * from mysql.columns_priv where Table_name='NET' and column_name='new';

dla procedury/funkcji :
select * from mysql.procs_priv where Routine_name='show_stats' ; 


Oczywiscie mozemy filtrować po dowolnej kolumnie danego widoku ; )

czwartek, 8 grudnia 2011

Distinct vs group by

Miałem dziś w pracy małą zagwozdkę.
Mianowicie serwer zaczał się dusić przy pewnym zapytaniu. Po modyfikacji skryptu udało mi się końcowe zapytnie ograniczyć do

mysql> select count(*) from kontrakty;
+----------+
| count(*) |
+----------+
|   224407 | 
+----------+

mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
|      630 | 
+----------+


select sql_no_cache distinct CONCAT(u.nazwisko,' ',u.imie) from kontrakty sk  join users u on (u.id_user=sk.id_user_realizacja)  order by nazwisko,imie;
91 rows in set (0.85 sec)

Niby fajnie czas spadł z ~4s do 0.85s ale ciągle wydawało mi się to zbyt długo.
Z czytania describe''a jestem cienki jak polsilver:

mysql> desc select sql_no_cache distinct CONCAT(u.nazwisko,' ',u.imie) from kontrakty sk  join sers u on (u.id_user=sk.id_user_realizacja)  order by nazwisko,imie; 
+----+-------------+-------+--------+----------------------------------------+---------------------+---------+---------------------------------+--------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                          | key                 | key_len | ref                             | rows   | Extra                                        |
+----+-------------+-------+--------+----------------------------------------+---------------------+---------+---------------------------------+--------+----------------------------------------------+
|  1 | SIMPLE      | sk    | index  | skontrakty_FKIndex3,id_user_realizacja | skontrakty_FKIndex3 | 4       | NULL                            | 217875 | Using index; Using temporary; Using filesort | 
|  1 | SIMPLE      | u     | eq_ref | PRIMARY                                | PRIMARY             | 4       | sk.id_user_realizacja |      1 |                                              | 
+----+-------------+-------+--------+----------------------------------------+---------------------+---------+---------------------------------+--------+----------------------------------------------+

Trochę pokombinowałem i nagle wpadłem na pomysł, zeby użyć group by. Efekt był pozytywnie zaskakujący : 91 rows in set (0.12 sec)

mysql> desc select sql_no_cache CONCAT(u.nazwisko,' ',u.imie) from kontrakty sk  join users u on (u.id_user=sk.id_user_realizacja)  group by u.id_user order by nazwisko,imie;
+----+-------------+-------+-------+----------------------------------------+--------------------+---------+--------------------+------+---------------------------------+
| id | select_type | table | type  | possible_keys                          | key                | key_len | ref                | rows | Extra                           |
+----+-------------+-------+-------+----------------------------------------+--------------------+---------+--------------------+------+---------------------------------+
|  1 | SIMPLE      | u     | index | PRIMARY                                | PRIMARY            | 4       | NULL               |  763 | Using temporary; Using filesort | 
|  1 | SIMPLE      | sk    | ref   | kontrakty_FKIndex3,id_user_realizacja | id_user_realizacja | 4       | u.id_user |  660 | Using index                     | 
+----+-------------+-------+-------+----------------------------------------+--------------------+---------+--------------------+------+---------------------------------+
Nie ma aż takiego szału ale patrząc na całość (4s->0.12s) to jestem zadowolony.
Jak na razie nie jestem w stanie powiedzieć czemu group by zadziałało szybciej ale w najbliższych planach mam nauczynie czytania się desc'a ;]

wtorek, 6 grudnia 2011

grep exclude-dir

Kiedy potrzebowałem przegrepować się w poszukiwaniu jakiegoś wzorca przeważnie używałem :
grep -r 'search_pattern' * | grep -v 'nazwa_katalogu'
CO jednak powodowało duzo wieksze uzycie cpu.
Grep bodajze od wersji 2.5 oferuje fajny parametr --exclude-dir:
To samo po nowemu:
grep  --exclude-dir='nazwa_katalogu/*' -r 'search_pattern' *
Jesli jeszcze chcemy pozbyć się jakis plików (np pdf) dodajemy :
grep  --exclude-dir='nazwa_katalogu/*' --exclude='*.pdf' -r 'search_pattern' *

niedziela, 4 grudnia 2011

key_buffer_size oraz myisam_sort_buffer_size

Idąc za ciosem doczytałem się jeszcze o dwóch zmiennych

key_buffer_size

The key_buffer_size is probably the most useful single variable to tweak. The larger you set it, the more of your MyISAM table indexes you store in memory. With most queries making use of an index, and memory being an order of magnitude faster than disk, the importance of this variable cannot be overestimated.
On dedicated MySQL servers, the rule-of-thumb is to aim to set the key_buffer_size to at least a quarter, but no more than half, of the total amount of memory on the server. Ideally, it will be large enough to contain all the indexes (the total size of all .MYI files on the server)


myisam_sort_buffer_size
used as buffer when alter table & myisam sorting is req. 

Z testow wynika, ze drugi parametr jest mniej istotny.
W kazdym razie wartosci zostaly zmieniony z
key_buffer_size - z 512MB na 1 i 2 GB
myisam_sort_buffer_size - z 8MB na 256MB
4 GB pamięci na serwerze

1.myisam_max_sort_file_size=10G key_buffer_size=1GB myisam_sort_buffer_size=256 MB

mysql> insert into historia_test2 select NULL,PK_nazwa,PK_wartosc,data_transakcji,typ_trasakcji,opis,id_user from historia;
Query OK, 4555320 rows affected (39.38 sec)
Records: 4555320  Duplicates: 0  Warnings: 0

mysql> insert into historia_test2 select NULL,PK_nazwa,PK_wartosc,data_transakcji,typ_trasakcji,opis,id_user from historia;
Query OK, 4555320 rows affected (43.46 sec)
Records: 4555320  Duplicates: 0  Warnings: 0

mysql> alter table historia_test2 enable keys;
Query OK, 0 rows affected (2 min 2.44 sec)

2.myisam_max_sort_file_size=10G key_buffer_size=2GB myisam_sort_buffer_size=256 MB
mysql> insert into historia_test2 select NULL,PK_nazwa,PK_wartosc,data_transakcji,typ_trasakcji,opis,id_user from historia;
Query OK, 4555320 rows affected (40.78 sec)
Records: 4555320  Duplicates: 0  Warnings: 0

mysql> insert into historia_test2 select NULL,PK_nazwa,PK_wartosc,data_transakcji,typ_trasakcji,opis,id_user from historia;
Query OK, 4555320 rows affected (43.70 sec)
Records: 4555320  Duplicates: 0  Warnings: 0

mysql> alter table historia_test2 enable keys;
Query OK, 0 rows affected (1 min 56.42 sec)
Jak widać zarówno na insertach jak i odbudowie indexow udało sie jeszcze urwać parę sekund ;)