USE/FORCE INDEX

4 отговора 0 прегледа
#1

USE/FORCE INDEX

Здравейте!

Имам два въпроса, свързани с USE/FORCE INDEX в MySQL.

Първо, каква е разликата между това дали ще е USE или FORCE (да, зная, че самите думи предполагат как ще се използва индекса), тъй като в реална ситуация не видях разлика.

И другото (съжалявам ако въпроса е ламерски), но защо в дадени ситуации при липса на USE/FORCE INDEX MySQL-a връща резултат, а при наличието му - не?

Рових подробно в mysql.com и mysqlperformanceblog.com на г-н Peter Zaitsev (изключително съдържателен блог между другото), но не успях да намеря отговори на въпросите си...

Предварително благодаря!

Редактирано от mr.vain на

Отговор
в отговор на mr.vain #2

Re: USE/FORCE INDEX

USE INDEX е "препоръка" с която оптимизатора може и да не се съобрази а FORCE INDEX е "заповед"

Нормално е ефектът да е еднакъв.

"защо в дадени ситуации при липса на USE/FORCE INDEX MySQL-a връща резултат, а при наличието му - не? "

Дай пример! Това или е някакъв много странен бъг или е повреден индекс.

salle.online.bg/sig
Отговор
в отговор на salle #3

Re: USE/FORCE INDEX

Ето пример:

SELECT
th.themeID,
th.themeNameEN,
ht.handlingID,
ht.handlingNameEN,
DATE(m.updated) AS updated,
COUNT(*) AS mainCount
FROM
v8_main AS m
INNER JOIN v8_themes AS th ON m.themeID = th.themeID
INNER JOIN v8_handling_types AS ht ON m.handlingID = ht.handlingID
WHERE
m.segmentID IN (4,5,6,1,3)
AND m.ph1008 IN (2,1,5,10,3,7,6,11,12,9,8,4)
AND m.handlingID IN (2,19,17,3,20,1,18,7,12,14,9,4,15,10,11,8,5)
AND DATE(m.updated) BETWEEN '2007-07-01' AND '2007-08-01'
GROUP BY
th.themeID,
ht.handlingID
ORDER BY
th.themeID,
ht.handlingNameEN;

# Query_time: 37 Lock_time: 0 Rows_sent: 71 Rows_examined: 1521661

---------------------------

SELECT
th.themeID,
th.themeNameEN,
ht.handlingID,
ht.handlingNameEN,
DATE(m.updated) AS updated,
COUNT(*) AS mainCount
FROM
v8_main AS m FORCE INDEX(monthStat_IDX)
INNER JOIN v8_themes AS th ON m.themeID = th.themeID
INNER JOIN v8_handling_types AS ht ON m.handlingID = ht.handlingID
WHERE
m.segmentID IN (4,5,6,1,3)
AND m.ph1008 IN (2,1,5,10,3,7,6,11,12,9,8,4)
AND m.handlingID IN (2,19,17,3,20,1,18,7,12,14,9,4,15,10,11,8,5)
AND DATE(m.updated) BETWEEN '2007-07-01' AND '2007-08-01'
GROUP BY
th.themeID,
ht.handlingID
ORDER BY
th.themeID,
ht.handlingNameEN;

# Query_time: 22 Lock_time: 0 Rows_sent: 0 Rows_examined: 1673826

monthStat индекса е на полетата `ph1008`, `handlingID`

Има три вида хора. Част от проблема, част от решението и част от пейзажа.

Редактирано от mr.vain на

Отговор
в отговор на mr.vain #4

Re: USE/FORCE INDEX

няма ли да пуснеш дефиниране на индекси по таблиците, че така да гадаем е [цунзурирано]

Отговор
в отговор на Bълk #5

Re: USE/FORCE INDEX

mysql> show index from v8_main;
+---------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| v8_main | 0 | PRIMARY | 1 | id | A | 1675502 | NULL | NULL | | BTREE | |
| v8_main | 1 | empID_IDX | 1 | empID | A | 341 | NULL | NULL | YES | BTREE | |
| v8_main | 1 | msisdn_IDX | 1 | msisdn | A | 837751 | NULL | NULL | YES | BTREE | |
| v8_main | 1 | themeID_IDX | 1 | themeID | A | 167550 | NULL | NULL | YES | BTREE | |
| v8_main | 1 | themeID_IDX | 2 | handlingID | A | 167550 | NULL | NULL | YES | BTREE | |
| v8_main | 1 | monthStat_IDX | 1 | ph1008 | A | 13 | NULL | NULL | YES | BTREE | |
| v8_main | 1 | monthStat_IDX | 2 | handlingID | A | 121 | NULL | NULL | YES | BTREE | |
+---------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
7 rows in set

mysql> show index from v8_themes
;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| v8_themes | 0 | PRIMARY | 1 | themeID | A | 232 | NULL | NULL | | BTREE | |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set
mysql> show index from v8_handling_types
;
+-------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| v8_handling_types | 0 | PRIMARY | 1 | handlingID | A | 17 | NULL | NULL | | BTREE | |
+-------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set

Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Отговор