MySQL užití proměnných

Ladik

MySQL užití proměnných
« kdy: 24. 04. 2015, 14:59:12 »
Ahoj,
lze přinutit MySQL aby v dotazech s proměnnou použila index?

Mám založenou tabulku a naplněnou daty:

CREATE TABLE `test` (
  `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE='MyISAM';

insert into test values (1),(2),(3),(4),(5);

Dále vykonám 3 příkazy:

select @id:=3;
select id from test where id=@id;
select id from test where id=3;

2. příkaz je bez použití indexu a 3. příkaz je s použitím indexu. Lze tedy nějak docílit u druhého příkazu použití indexu?
Děkuji.


Peterman

Re:MySQL užití proměnných
« Odpověď #1 kdy: 24. 04. 2015, 15:23:19 »
mysql> DESC select id from test where id=@id;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | test  | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)

mysql> DESC select id from test where id=@id;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | test  | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)

Peterman

Re:MySQL užití proměnných
« Odpověď #2 kdy: 24. 04. 2015, 15:25:30 »
eh, pardon, drobná chybička v copy/paste, první příklad měl být pochopitelně s "=3",
nicméně výsledek je stejný ...

Ladik

Re:MySQL užití proměnných
« Odpověď #3 kdy: 24. 04. 2015, 16:04:55 »
Aha... tak v tom případě mě zmátl Adminer (http://www.adminer.org/), protože kde je id=@id, tak kliknutím na "explain" vygeneroval

id?   select_type?   table?   partitions?   type?   possible_keys?   key?   key_len?   ref?   rows?   Extra?
1   SIMPLE   NULL   NULL   NULL   NULL   NULL   NULL   NULL   NULL   Impossible WHERE noticed after reading const tables[/tt]

kdežto u id=3 vygeneroval

id   select_type   table   type   possible_keys   key   key_len   ref   rows   Extra
1   SIMPLE   test   const   PRIMARY   PRIMARY   4   const   1   Using index[/tt]

Děkuji moc - je to pro mě poučení na příště, že ne vše, co člověk vidí, je pravda.