Partizionamento

Se ho una tabella con molti record, e quindi un grosso file, posso decidere di dividere il file in n più piccoli e, in base alla query, ottenere prestazioni migliori.

Un ottimo punto da cui iniziare è: StarData

al quale possiamo aggiungere:

  • Per sapere dove sono saltati i file delle tabelle:

show variables like ‘datadir’

  • Per avere informazioni sullo stato attuale

SELECT DISTINCT PARTITION_EXPRESSION
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA=’nomeSchema’ AND TABLE_NAME=’nomeTabella’

SELECT PARTITION_ORDINAL_POSITION, TABLE_ROWS, PARTITION_METHOD
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = ‘nomeSchema’ AND TABLE_NAME = ‘nomeTabella’

  • Per sapere quali file legge una determinata query

EXPLAIN partitions SELECT * FROM tabella WHERE id=1234

  • Per inizializzare

ALTER TABLE nomeTabella
PARTITION BY LIST COLUMNS (idCheVoglioUsare) (
PARTITION P111 VALUES IN (‘111’),
PARTITION P222 VALUES IN (‘222’)
)

  • Per aggiungere altre partizioni

ALTER TABLE nomeTabella
ADD PARTITION (
PARTITION a61714 VALUES IN (‘61714’)
)

  • Per cancellare tutte le partizioni e riavere un solo file per la tabella indicata

ALTER TABLE nomeTabella REMOVE PARTITIONING

  • Per cancellare solo una partizione

ALTER TABLE eventdata2 DROP PARTITION a61714

 

MySql joins

Ottimo link: http://www.mrwebmaster.it/mysql/join_6812.html

FROM tab_a left join tab_b ON tab_a.id = tab_b.id

tab_a e’ a sx… il primo che trovi, tab_b e’ a dx della dichiarazione. In sostanza: vengono presi TUTTI i record di tab_a e confrontati con tutti i record id della tab_b. se c’e’ corrispondenza bene, altrimenti tab_b rende NULL.

RIGHT join invece avrebbe preso TUTTI i record di tab_b e chi renderebbe un eventuale NULL sarebbe la tab_a.