Autor Zpráva
MaK
Profil
Mám tabulku a dotaz:

CREATE TABLE geo
(
     a    int(10) unsigned NOT NULL,
     b    int(10) unsigned NOT NULL,
     code    varchar(2)NOT NULL
)

select * from geo where 1707358628 between a AND b limit 1;

+----+-------------+--------+------------+-------+--------------------------------+-------------+---------+------+-------+----------+-------------+
| id | select_type | table  | partitions | type  | possible_keys                  | key         | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------+------------+-------+--------------------------------+-------------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | geo    | NULL       | range | a,b,c                          | a           | 4       | NULL | 41438 |    50.00 | Using where |
+----+-------------+--------+------------+-------+--------------------------------+-------------+---------+------+-------+----------+-------------+

ale ať mu podstrkávám všelijaké indexy explain dopadne vždy stejně.
Jaky pro tento typ dotazu použít index?
Kajman
Profil
Však použil index a. A řádky pak ještě filtroval bez indexu dle podmínky na sloupec b. Mysql myslím neuměla moc dobře použít dva indexy a dělat z nich průnik.

Nevím, jak to je na nové verzi, jestli to už umí lépe, v manuálu se tomu věnují
dev.mysql.com/doc/refman/8.0/en/range-optimization.html

Na rozsahy se proto občas používají spatil data, hlavně pro ty starší verze mysql, viz
blog.jcole.us/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis
Navíc, pokud se tabulka jmenuje geo, tak bych využití spatial dat a indexů očekával.
MaK
Profil
Kajman:
Však použil index a. A řádky pak ještě filtroval bez indexu dle podmínky na sloupec b.
Takové chování je pro index nad jedním sloupce pochopitelné.
Ale předpokládal jsem, že nad párovým indexem UNIQUE (a,b) bude rozumnější.
Kajman
Profil
Pokud by byl dotaz např.
a=1 and b>10
tak by se použil. B-tree indexy, nejsou ideální pro dotaz
1707358628 between a AND b
en.wikipedia.org/wiki/B-tree

Zmíněné spatial indexy použijí R-tree
en.wikipedia.org/wiki/R-tree

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0