Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przechowywać 128-bitową liczbę w jednej kolumnie w MySQL?

Zadałem to pytanie i we wszystkich przeczytanych postach nigdy nie znalazłem żadnych porównań wydajności. Oto moja próba.

Utworzyłem następujące tabele, wypełnione 2 000 000 losowych adresów IP ze 100 losowych sieci.

CREATE TABLE ipv6_address_binary (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr BINARY(16) NOT NULL UNIQUE
);

CREATE TABLE ipv6_address_twobigints (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    haddr BIGINT UNSIGNED NOT NULL,
    laddr BIGINT UNSIGNED NOT NULL,
    UNIQUE uidx (haddr, laddr)
);

CREATE TABLE ipv6_address_decimal (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr DECIMAL(39,0) NOT NULL UNIQUE
);

Następnie WYBIERAM wszystkie adresy IP dla każdej sieci i zapisuję czas odpowiedzi. Średni czas odpowiedzi w tabeli twobigints wynosi około 1 sekundy, podczas gdy w tabeli binarnej około jednej setnej sekundy.

Oto pytania.

SELECT COUNT(*) FROM ipv6_address_twobigints
WHERE haddr & NETMASK_HIGH = NETWORK_HIGH
AND laddr & NETMASK_LOW = NETWORK_LOW

SELECT COUNT(*) FROM ipv6_address_binary
WHERE addr >= NETWORK
AND addr <= BROADCAST

SELECT COUNT(*) FROM ipv6_address_decimal
WHERE addr >= NETWORK
AND addr <= BROADCAST

Średnie czasy odpowiedzi:

Wykres:

BINARY_InnoDB  0.0119529819489
BINARY_MyISAM  0.0139244818687
DECIMAL_InnoDB 0.017379629612
DECIMAL_MyISAM 0.0179929423332
BIGINT_InnoDB  0.782350552082
BIGINT_MyISAM  1.07809265852


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel - jak zaktualizować całą kolekcję

  2. Zamień ciąg znaków MySQL

  3. Dlaczego rozmiar mojego stołu jest ponad 4 razy większy niż oczekiwano? (wiersze*bajty/wiersz)

  4. DAO.Recordset.Update powoduje blokadę zapisu

  5. Zwiększanie bezpieczeństwa logowania