Upload
william-felipe
View
281
Download
0
Embed Size (px)
Citation preview
PHP e PostgreSQL, Dois Elefantes Trabalham muito
mais!
Nome William Felipe WelterDez/2015
2
# whoami
➢ Bacharel em Ciência da Computação;
➢ Gerente da equipe de desenvolvimento da 4Linux;
➢ Experiência com desenvolvimento (PHP e C) e infraestrutura.
NomeWilliam Felipe Welter
3
Conhecendo a 4Linux
➢ Metodologia IT Experience -
Cenários reais
➢ Cursos práticos, rápidos e baratos de
autores feras: www.4shot.com.br
➢ Projetos complexos de missão crítica,
com infra e desenvolvimento PHP
4
Alguns dos nossos clientes
A 4Linux suporta o ecossistema de
software livre da Caixa. Um dos maiores
cases do mundo.Clientes que confiam na qualidade dos serviços
da 4Linux.
5
Cursos práticos, rápidos e baratos de autores feras
6
7
Lançamento 4Linux
8
PHP e PostgreSQL
9
Por que, hoje, o PHP é tão ligado ao MySQL ?
PHP e PostgreSQL
10
PHP e PostgreSQL
➢ Lançados juntos (PHP ~94 / MySQL ~95);
➢ MySQL tinha porte para Windows;
➢ PostgreSQL passou a ter porte para Windows a partir da
versão 8.0 (2005);
➢ Não tinha integridade referencial (MyISAM);
➢ Pouca configuração;
➢ Maioria dos webhosts adotaram.
11
PHP e PostgreSQL
Por que você usa MySQL? Minha aplicação
é pequena. Por isso, resolvi
usar o MySQL. Quando crescer penso em outro
banco...
12
PHP e PostgreSQL
Qual é o problema de mudar depois?
13
PHP e PostgreSQL
➢Se usar extensões “mysql” , “mysqli”...
14
PHP e PostgreSQL
➢Se usar PDO ...
15
PHP e PostgreSQL
➢Se usar um ORM..
16
PHP e PostgreSQL
Por que não começar com o
PostgreSQL?
17
PHP e PostgreSQL
Eu uso o phpMyAdmin, como faço no
PostgreSQL?
18
PHP e PostgreSQL
19
PHP e PostgreSQL
Cliente desktop:
20
PHP e PostgreSQL
21
PHP e PostgreSQL
22
PHP e PostgreSQL
➢psql:
23
PHP e PostgreSQL
➢Muito fácil;
➢Autocomplete (TAB);
➢History, ctrl+r (libreadline);
➢Meta Comandos;
➢Visão expandida ;
➢Editor externo.
24
PHP e PostgreSQL
➢E, para modelar ?
SQL PowerArchitect
PgModeler
25
PHP e PostgreSQL
Mas, por que o PostgreSQL?
26
PHP e PostgreSQL
➢Derivou, originalmente, do projeto Ingres;
➢ Iniciou-se, em 1974, na universidade de Berkeley;
➢Outros projetos derivados: Sybase, SQL Server,
NonStop SQL;
➢Linguagem SQL introduzida em 1994.
Um pouco de história:
27
PHP e PostgreSQL
➢Licença é BSD-style;
➢Não tem uma empresa dona do projeto;
➢Projeto é livre!
➢Preza por estabilidade em favor de novas
funcionalidades “da moda”;
➢Segue a risca ao padrão ANSI-SQL 2008.
Principais características:
28
PHP e PostgreSQL
➢Maduro;
➢Estável;
➢Segue padrões!
➢Suporte independente de fornecedor!
➢Futuro do projeto não esta mão de uma única
empresa.
Primeiras conclusões:
29
PHP e PostgreSQL
DESEMPENHO
30
PHP e PostgreSQL
Escalabilidade Vertical
31
PHP e PostgreSQL
➢CPU:
➢Segundo documentação 32 e 64 cores;
➢Experiência pessoal > 80 cores;
➢Memória:
➢Experiência pessoal 1TB;
➢Discos:
➢Tablespaces, RAID, LVM.
32
PHP e PostgreSQL
Índices
33
PHP e PostgreSQL
➢Multicolunas;
➢ Índices parciais;
➢ Índices baseados em expressões;
➢ Index e Reindex, sem locks.
34
PHP e PostgreSQL
➢ b-tree (default):
➢ Numérico e textual
➢ Null/not null
➢ Like
➢ Hash:
➢ =
➢ Pequeno
➢ Corrompe fácil
➢ GIN:
➢ Estruturas complexas
➢ Arrays
➢ FTS
➢ GiST:
➢ Buscas além de intervalos e igualdade
➢ Operadores geométricos
➢ FTS
➢ SP-GiST:
➢ Arvore não balanceada
➢ CAD, data mining, GIS
35
PHP e PostgreSQL
Planejador de consultas
36
PHP e PostgreSQL
➢Baseado em pesos (customizável);
➢Por tablespace;
➢Coletor de estatísticas;
➢Auto analyze;
➢Otimizador de busca genética.
37
PHP e PostgreSQL
➢seqscan;
➢ indexscan;
➢bitmapscan;
➢hash aggregate;
➢hash join;
➢merge join;
➢nested loop;
38
PHP e PostgreSQL
Views
39
PHP e PostgreSQL
➢Views materializadas:
➢Consultas complexas e lentas;
➢Reutilizadas;
➢Comporta-se com uma tabela quando utilizado em
consultas;
➢Permite criação de índices;
➢Pode ser atualizada.
40
PHP e PostgreSQL
SEGURANÇA (CONTROLE DE ACESSO)
41
PHP e PostgreSQL
➢Suporte a grupos e herança de privilégios (ROLES);
➢Suporte a múltiplos schemas;
➢Autenticação baseada em hosts (HBA);
➢Suporta o PAM;
➢Bancos são completamente isolados;
➢Granularidade de privilégios.
42
PHP e PostgreSQL
BACKUP
43
PHP e PostgreSQL
➢Dump:
➢A quente, sem locks;
➢Textual ou binário;
➢O dump e restauração pode ser paralelizados;
➢PITR:
➢Backup continuo, a nível transacional;
➢A quente.
44
PHP e PostgreSQL
➢Master-Slave;
➢Hot-standby;
➢Síncrona ou Assíncrona;
➢Replicas em cascata;
➢Física e lógica*;
➢Novas replicas sem lock ou paradas.
Replicação Nativa:
45
PHP e PostgreSQL
➢ Bucardo (Open Source):
➢ Multimaster;
➢ Lógica;
➢ Slony;
➢ Skytools;
➢ RepManager.
Replicação, ferramentas externas:
46
PHP e PostgreSQL
INTEGRAÇÃO COM OUTROS SISTEMAS
47
PHP e PostgreSQL
➢PostgreSQL;
➢MySQL;
➢Oracle;
➢MS SQL;
➢Sybase;
➢ ...
FDW:
48
PHP e PostgreSQL
GRANDE VARIEDADE DE TIPO DE DADOS
49
PHP e PostgreSQL
➢Json;
➢Xml;
➢Hstore*;
➢Arrays;
➢Geometric.
50
PHP e PostgreSQL
QUESTÕES CONHECIDAS DO MySQL
51
PHP e PostgreSQL
➢Conversão automática de tipos:
mysql> CREATE TABLE notas ( id integer primary key auto_increment, alu_id integer not null, description varchar(150), grade float not null
);mysql> INSERT INTO notas(alu_id,description,grade) VALUES
( 'fulano', 'Nota da primeira fase', 4.4);
mysql> SELECT * FROM notas;+----+--------+-----------------------+-------+| id | alu_id | description | grade |+----+--------+-----------------------+-------+| 1 | 0 | Nota da primeira fase | 4.4 |+----+--------+-----------------------+-------+
52
PHP e PostgreSQL
mysql> CREATE TABLE answer ( id integer primary key, alu_id integer not null, answer varchar(100), date timestamp not null
)mysql> INSERT INTO answer ( alu_id,answer, date) VALUES (1,'Thi is ..','08/07/15');
mysql> SELECT * FROM answer;+----+--------+-----------+---------------------+| id | alu_id | answer | date |+----+--------+-----------+---------------------+| 0 | 1 | Thi is .. | 2008-07-15 00:00:00 |+----+--------+-----------+---------------------+
53
PHP e PostgreSQL
➢ < 5.6.7, perda de integridade referencial com alter table.
➢ => 5.6.7, bloqueia alter table em colunas com foreign key.
mysql> CREATE TABLE notas ( id integer primary key auto_increment, alu_id integer, description varchar(150), grade float not null, constraint alu_id_fk
foreign key (alu_id) references alunos(id) );
mysql> ALTER TABLE notas CHANGE alu_id alu_id integer not null;ERROR 1832 (HY000): Cannot change column 'alu_id': used in a foreign key constraint 'alu_id_fk'
54
PHP e PostgreSQL
➢Comportamento no PostgreSQL:
fisl=# CREATE TABLE notas ( id serial primary key,
alu_id integer references alunos(id), description varchar, grade float not null
);fisl=# ALTER TABLE notas ALTER COLUMN alu_id SET not null;ALTER TABLE
fisl=# ALTER TABLE notas ALTER COLUMN alu_id DROP not null;ALTER TABLEfisl=# INSERT INTO notas ( description, grade) VALUES ('asdfasdfa',5.5);INSERT 0 1fisl=# ALTER TABLE notas ALTER COLUMN alu_id SET not null;ERROR: column "alu_id" contains null values
55
PHP e PostgreSQL
➢ Sintaxes não implementadas, são aceitas silenciosamente:
mysql> create table notas ( id integer primary key auto_increment, alu_id integer references alunos(id), description varchar(150), grade float not null);Query OK, 0 rows affected (0,59 sec)mysql> desc notas;+-------------+--------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------------+--------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || alu_id | int(11) | YES | | NULL | || description | varchar(150) | YES | | NULL | || grade | float | NO | | NULL | |+-------------+--------------+------+-----+---------+----------------+
56
PHP e PostgreSQL
➢ GROUP BY, colunas sem agregação = resultado indeterminado:
Ex3:mysql> select * from notas;+----+--------+-------------+-------+| id | alu_id | description | grade |+----+--------+-------------+-------+| 1 | 1 | teste | 2.2 || 2 | 1 | teste2 | 2.2 || 3 | 1 | fulano | 2.2 || 4 | 1 | fulano | 3 |+----+--------+-------------+-------+4 rows in set (0,00 sec)
mysql> select * from notas group by alu_id ;+----+--------+-------------+-------+| id | alu_id | description | grade |+----+--------+-------------+-------+| 1 | 1 | teste | 2.2 |+----+--------+-------------+-------+1 row in set (0,00 sec)
57
PHP e PostgreSQL
➢Comportamento no PostgreSQL:
fisl=> select * from notas; id | alu_id | description | grade ----+--------+-------------+------- 2 | 1 | asdfasdfa | 5.5 3 | | asdfasdfa | 5.5 4 | 1 | fulano | 4.3 5 | 1 | fulano | 8 6 | 2 | ciclano | 9(5 rows)fisl=> select * from notas group by alu_id;ERROR: column "notas.id" must appear in the GROUP BY clause or be used in an aggregate function
58
PHP e PostgreSQL
fisl=> select alu_id,count(*) as total from notas group by alu_id; alu_id | total --------+------- | 1 1 | 3 2 | 1
59
PHP e PostgreSQL
PostgreSQL no PHP
60
PHP PostgreSQL
pgsql extension
61
PHP e PostgreSQL
➢Similar a extensão mysql (depreciada):
<?phppg_connect('host=localhost user=fisl dbname=fisl password=123456');
$rs=pg_query("SELECT * FROM alunos");$alunos=pg_fetch_all($rs);
print_r($alunos);
pg_close();
62
PHP e PostgreSQL
➢Suporta prepared statements:
<?php$dbc=pg_connect('host=localhost user=fisl dbname=fisl password=123456');
$sql = 'INSERT INTO alunos(name) VALUES ($1)';$params = array( 'william');
pg_prepare($dbc,'insertalunos', $sql);pg_execute($dbc,'insertalunos', $params);
pg_close();
63
PHP e PostgreSQL
➢Chamadas assíncronas:
<?php$dbc=pg_connect('host=localhost user=fisl dbname=fisl password=123456');
if(!pg_connection_busy($dbc)){ pg_send_query($dbc,'SELECT * FROM notas'); $result=pg_get_result($dbc); }
$data= pg_fetch_all($result);print_r($data);
pg_close($dbc);
64
PHP e PostgreSQL
PDO
65
PHP e PostgreSQL
➢Métodos idênticos ao MySQL:
<?php
$db = new PDO('pgsql:host=localhost;dbname=fisl','fisl','123456');
$result=$db->query('SELECT * FROM alunos');
$data=$result->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
66
PHP e PostgreSQL
➢PDO::lastInsertId('nomedasequence'):
<?php
$db = new PDO('pgsql:host=localhost;dbname=fisl','fisl','123456');
$stmt=$db->prepare('INSERT INTO alunos(name) VALUES (?)');
$stmt->execute(array('Felipe'));
$id = $db->lastInsertId('alunos_id_seq');
echo $id;
67
PHP e PostgreSQL
➢Nome padrão das sequences: table_column_seq;
➢Como identificar o nome de uma sequence?
68
PHP e PostgreSQL
fisl=> \d notas Table "public.notas" Column | Type | Modifiers -------------+-------------------+---------------------------------------------------- id | integer | not null default nextval('notas_id_seq'::regclass) alu_id | integer | description | character varying | grade | double precision | not nullIndexes: "notas_pkey" PRIMARY KEY, btree (id)Foreign-key constraints: "notas_alu_id_fkey" FOREIGN KEY (alu_id) REFERENCES alunos(id)
69
Conclusão
➢Quando sua aplicação crescer:
➢Robusta;
➢Confiável;
➢Desempenho;
➢Escalável;
➢Segura.
70
Perguntas
71
Boa Sorte!!