Doctrine a index na boolean

0

Ktoś mi podpowie, czemu założenie indexu na kolumnie boolean w Doctrine powoduje extremalne zwolnienie wyszukiwania?

/**
* @ORM\Table(name="my_entity", indexes={
*  @ORM\Index(name="my_property_idx", columns={"my_property"}),
* })
* @ORM\Entity

...

/**
 *
 * @ORM\Column(type="boolean")
 */
private $myProperty;

Querowanie milion rekordów bez indexu myProperty trwa milisekundy, podczas gdy z indexem trwa kilkadziesiąt sekund. Z innymi indexami jak number czy text nie ma problemów, tylko z boolean.

MySQL 8.0

4

Wrzuć to zapytanie na jakim masz spowolnienie. Zobacz co pokazuje explain query. Zobacz też na samej bazie jaki typ indeksu jest zakładany.

2

Indeksowanie booleana może być bez sensu ze względu na to, że masz tylko 2 wartości, więc w 1M rekordów może być np. 800k true i 200k false. Jeśli masz warunek property=true, to jest spełniony dla 800k rekordów i je dalej musisz przetworzyć (bądź silnik, aplikując dodatkowe warunki). Oczywiście dystrybucja danych w kolumnie property może być inna (np. 1 true i 999 999 false), wówczas zapytanie dla property=true powinno wykonać się błyskawicznie, zaś to dla property=false zapewne tragicznie wolno.

Może być tak, że silnik bazodanowy skanuje indeks i dla każdego pasującego elementu sięga po dane tabeli w określonym bloku, może więc zrobić skanowanie indeksu + 800k sięgnięć do bloku danych (jeśli dane np. zapisane są w 1000 blokach, to silnik może wykonać 800k * 1000 odczytów bloków, co jest dużo gorszą opcją niż full scan, który dotknie tylko 1000 bloków).

1 użytkowników online, w tym zalogowanych: 0, gości: 1