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

Czy należy unikać MEDIUMINT w MySQL?

InnoDB przechowuje MEDIUMINT jako trzybajtową wartość. Ale kiedy MySQL musi wykonać jakiekolwiek obliczenia, trzy bajty MEDIUMINT są konwertowane na osiem bajtów unsigned long int (zakładam, że obecnie nikt nie uruchamia MySQL na 32 bitach).

Są plusy i minusy, ale rozumiesz, że rozumowanie „jest głupie i wolne, a kod, który to implementuje, jest pełzającym horrorem” nie jest techniczne, prawda?

Powiedziałbym, że MEDIUMINT ma sens, gdy rozmiar danych na dysku jest krytyczny. Tj. gdy tabela ma tak wiele rekordów, że nawet jeden bajt różnicy (4 bajty INT vs 3 bajty MEDIUMINT) wiele znaczy. To raczej rzadki przypadek, ale możliwy.

mach_read_from_3 i mach_read_from_4 - prymitywy używane przez InnoDB do odczytywania liczb z rekordów InnoDB są podobne. Oboje zwracają ulint. Założę się, że nie zauważysz różnicy na żadnym obciążenie pracą.

Wystarczy spojrzeć na kod:

ulint
mach_read_from_3(
/*=============*/
        const byte*     b)      /*!< in: pointer to 3 bytes */
{
        ut_ad(b);
        return( ((ulint)(b[0]) << 16)
                | ((ulint)(b[1]) << 8)
                | (ulint)(b[2])
                );
}

Czy uważasz, że jest znacznie wolniejszy?

ulint
mach_read_from_4(
/*=============*/
        const byte*     b)      /*!< in: pointer to four bytes */
{
        ut_ad(b);
        return( ((ulint)(b[0]) << 24)
                | ((ulint)(b[1]) << 16)
                | ((ulint)(b[2]) << 8)
                | (ulint)(b[3])
                );
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Uzyskaj licznik dla każdej zduplikowanej wartości

  2. PHP-MYSQL:Konwersja uniksowego znacznika czasu na datę i godzinę i na odwrót

  3. phpMyAdmin - Błąd> Nieprawidłowy parametr formatu?

  4. Usuń końcowe zera w wartości dziesiętnej ze zmieniającą się długością

  5. REGEXP z PDO Mysql