Unele diferențe interesante de la MySQL, note programator PostgreSQL

MySQL fără motiv este foarte popular în lumea bazelor de date relaționale. Acest lucru este bun, potrivit RDBMS open source. Dar nu singurul de acest gen. PostgreSQL nu este mai rău decât MySQL, și în multe privințe - chiar mai bine. Să încercăm să aflăm ce este.

În PostgreSQL, puteți utiliza cursoarele. Imaginați-vă că unele interogare returnează gigabytes de date. Trebuie să treci întregul concert în rețea (în cazul în care baza de date ruleaza pe un server separat) și îl stochează în memorie înainte de ceva de-a face cu ea. Chiar dacă utilizați driver-ul suportă funcții precum fetch_next_row, de fapt, el este încă în primul rând pune întregul rezultat al interogării în memorie. Cu ajutorul cursorului, nu se poate ridica numai fragmente de date, astfel tratarea acestora într-o cantitate constantă de memorie, dar, de asemenea, libertatea de a le muta în direcții diferite. De exemplu, puteți citi primele 100 de linii, uita-te apoi 10,001th, și în funcție de valoarea sa de du-te la ultima linie, sau chiar închide cursorul.

Nu mai puțin interesant este mecanismul de indici funcționali. Să presupunem că aveți nevoie pentru a stoca numele utilizatorului în coloane separate și sensibile, dar căutarea pentru utilizatori în același timp, există numele complet și lipsiti de sensibilitate. În cazul în care baza de date nu acceptă codurile de funcție, trebuie să creați un câmp suplimentar în tabel cu o valoare mai mică # 40; FIRST_NAME || '' || LAST_NAME # 41;. construi pe ea și să păstreze indicele în acest domeniu este valoarea corectă. În cazul în care astfel de cereri variante de zece, veți avea nevoie de zece coloane suplimentare. Indicii funcționali, după cum sugerează și numele, permite să construiască un index pe funcția arbitrară, evitându-se astfel toate problemele descrise mai sus. De exemplu, puteți executa în mod eficient interogări cu condiții, cum ar fi atunci când păcatul # 40; x # 41;> 0,45 și păcatul # 40; x # 41; <0.46 .

Codurile PostgreSQL pot construi doar o parte din rândurile din tabel. Acest mecanism se numește un indice parțial. De exemplu, dacă accesați în baza de date cu interogări, cum ar fi SELECT * FROM jurnalele UNDE ip> inet „192.168.0.0“ ȘI ip

PostgreSQL acceptă scanări bitmap. De exemplu, aveți nevoie pentru a rula o interogare cu condiția în care a = 1 și b = 2. În MySQL, puteți construi un index pe mai multe coloane. pentru a executa în mod eficient această cerere și cereri în care a = 1. Dacă un> 1. dar unde b = 2 sau în cazul b> 10, și b <20. Для эффективного выполнения двух последних запросов понадобится дополнительный индекс по полю b. PostgreSQL также поддерживает индексы по нескольким столбцам. Однако, благодаря поддержке bitmap scans, в PostgreSQL вы можете построить отдельный индекс по a, отдельный индекс по b и использовать эти индексы во всех приведенных запросах, даже с участием в условии обоих полей. Помимо одновременного использования нескольких индексов bitmap scans позволяет эффективно выполнять запросы с условиями вроде WHERE a = 4 OR a = 8 OR a = 15 OR a = 16. Работает это очень просто. Запрос разбивается на несколько подзапросов, каждый из которых выполняется с использованием подходящих индексов, а потом результаты выполнения этих запросов объединяются OR’ом или AND’ом.

PostgreSQL oferă diferite tipuri de indici, în plus față de Hash clasică și indicii B-Tree. De exemplu, folosind indici GIST și SP-GIST pot găsi toate punctele situate într-un interval predeterminat. Indicii GIST permite, de asemenea, de exemplu, umplerea sortare în funcție de distanța până la poziția curentă, precum și de a face alte operațiuni cu geodate. Indicii GIN sunt proiectate pentru a lucra cu tipurile care pot conține mai mult de o valoare. De exemplu, folosind indexul de acest tip puteți găsi toate matricele care conțin elementul specificat. Ca GIN, și indexurile GIST pot fi utilizate pentru căutare full-text. În timp ce căutarea full-text PostgreSQL funcționează într-adevăr nu mai rău decât Sfinxul, ceea ce despre MySQL nu se poate spune. Un alt interesante tipuri de indici trebuie remarcat indicele BRIN (cod nu foarte rapid, dar super-compact) și Bloom (filtru Bloom).

Dintre ceilalți, dar nu mai puțin important, diferențele de la MySQL PostgreSQL aș dori să recunoască susținerea ultimei expresii regulate. savepoint'ov (este aproape tranzacții care imbricate), interogări recursive. moștenire de masă. capacitatea de a scrie proceduri stocate și triggere pe Tcl, Perl si Python, precum și de logare interogări lent cu timpul la interval de milisecunde. Desigur, diferențele nu se termina aici.

Este imposibil să nu acorde atenție la câteva lucruri care nu sunt legate de PostgreSQL functionale si MySQL. Ca avantaje PostgreSQL fata de alte RDBMS fiabilitate codul adesea marcat. Într-o zi am fost ascultat un raport Konstantina Osipova. care, printre altele, el a menționat un experiment interesant. aleatoare incorecte SQL interogări în stilul în care a fost scris * DIN SELECT. Majoritatea oamenilor nu s-ar gândi de a scrie acest lucru. Aceste cereri au fost hrănite MySQL. Ca urmare, sa găsit o duzină de cereri, picătură baza de date. Întrebarea este, dacă MySQL atât de prost interogare parser scris. ceea ce se întâmplă în restul bazei de date? Eu cu siguranță nu ar avea încredere în ea pentru a păstra informațiile despre contul meu bancar.

Desigur, PostgreSQL are propriile sale nuanțe. De exemplu, dacă aveți un tabel (id, autentificare, treci). puteți obține ALERT'nut și (id, autentificare, treci, e-mail). dar nu (id, autentificare, e-mail, treci). Adică, puteți adăuga coloane la sfârșitul anului. Desigur, dacă nu creați un tabel complet nou. Cu toate acestea, acest lucru nu este de obicei o mare problemă. De asemenea, în PostgreSQL nu se poate scrie o interogare ca INSERT INTO blablabla LA CHEIE blablabla UPDATE DUPLICATE (plus: în PostgreSQL 9.5 este fix). S-ar părea, într-o singură tranzacție, puteți scrie DELETE, apoi INSERT, dar aceasta nu funcționează. Soluția corectă este de a scrie Fuzionare-funcția. Codul de îmbinare-funcție este ușor de a genera în mod automat. astfel încât acest lucru nu este, de asemenea, o mare problemă.

Să sperăm că, după ce a citit acest articol vă va dori să se uite mai atent PostgreSQL.

Ca și postul? Împărtășește cu alții: