Size: a a a

2020 November 27

IZ

Ilia Zviagin in MySQL
Бородатый Таракан
так он же в key использует PRIMARY
Ну и что, это тебе не индекс что ли?
источник

IZ

Ilia Zviagin in MySQL
Бородатый Таракан
create index IE_PAYMENTS_PAYER_REF_ACC on payments (payerSideReferencedAccountKey, documentDate);
create index IE_PAYMENTS_RECIPIENT_REF_ACC on payments (recipientSideReferencedAccountKey, documentDate);
create index IE_PAYMENTS_SERVICE_PAY_KEY on payments (servicePayKey);
Тут дата в индексах лишняя, может мешать
источник

I

I'm in MySQL
Ilia Zviagin
Как можно сделать ЧТО?
Запрос, который я не видел над таблицами, которые хер знает какие?
В продолжении ночного разговора:
EXPLAIN SELECT * FROM _cats_sync AS s, _items AS i  WHERE s.cat_id IN (109,152,153,156,157,158,214,163,166,140) AND s.status = 1 AND s.p_status = 1 AND s.id = i.id LIMIT 100;
1   SIMPLE   s   range   cat_id,id   cat_id   4   NULL  280   Using where

CREATE TABLE IF NOT EXISTS _cats_sync (
 id mediumint(8) unsigned NOT NULL,
 cat_id smallint(5) unsigned NOT NULL,
 status tinyint(1) unsigned NOT NULL,
 p_status tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE _cats_sync
 ADD UNIQUE KEY (cat_id,status,p_status,id),
 ADD KEY id (id);
Может быть то Using where; Using index (когда в EXPLAIN больше 500 ROWS), а может Using where просто
источник

DE

Denis Efremov in MySQL
I'm
В продолжении ночного разговора:
EXPLAIN SELECT * FROM _cats_sync AS s, _items AS i  WHERE s.cat_id IN (109,152,153,156,157,158,214,163,166,140) AND s.status = 1 AND s.p_status = 1 AND s.id = i.id LIMIT 100;
1   SIMPLE   s   range   cat_id,id   cat_id   4   NULL  280   Using where

CREATE TABLE IF NOT EXISTS _cats_sync (
 id mediumint(8) unsigned NOT NULL,
 cat_id smallint(5) unsigned NOT NULL,
 status tinyint(1) unsigned NOT NULL,
 p_status tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE _cats_sync
 ADD UNIQUE KEY (cat_id,status,p_status,id),
 ADD KEY id (id);
Может быть то Using where; Using index (когда в EXPLAIN больше 500 ROWS), а может Using where просто
EXPLAIN SELECT * FROM `_cats_sync` AS s, `_items` AS i  WHERE s.`cat_id` IN (109,152,153,156,157,158,214,163,166,140) AND s.`status` = 1 AND s.`p_status` = 1 AND s.`id` = i.`id` LIMIT 100;
источник

DE

Denis Efremov in MySQL
I'm
В продолжении ночного разговора:
EXPLAIN SELECT * FROM _cats_sync AS s, _items AS i  WHERE s.cat_id IN (109,152,153,156,157,158,214,163,166,140) AND s.status = 1 AND s.p_status = 1 AND s.id = i.id LIMIT 100;
1   SIMPLE   s   range   cat_id,id   cat_id   4   NULL  280   Using where

CREATE TABLE IF NOT EXISTS _cats_sync (
 id mediumint(8) unsigned NOT NULL,
 cat_id smallint(5) unsigned NOT NULL,
 status tinyint(1) unsigned NOT NULL,
 p_status tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE _cats_sync
 ADD UNIQUE KEY (cat_id,status,p_status,id),
 ADD KEY id (id);
Может быть то Using where; Using index (когда в EXPLAIN больше 500 ROWS), а может Using where просто
источник

IZ

Ilia Zviagin in MySQL
Бородатый Таракан
Добрый день, нужна помощь дба по тому как заставить мускуль юзать индексы.
Есть запрос
select
 distinct p.cbsKey,
 (еще полей 70 эдак)
from payments p, paymentCardIndex pci
where p.cbsKey = pci.cbsKey
and p.documentDate = pci.documentDate
and ( p.payerSideReferencedAccountKey = ? or p.recipientSideReferencedAccountKey = ?)

И есть explain его)
Так вопрос такой - почему он не использует индексы и лезет сканить все партиции по PK?
Скажи, сколько в таблице строк, и сколько строк приходится на
указанные в запросе значения поля
p.payerSideReferencedAccountKey = ?
и сколько на
p.recipientSideReferencedAccountKey = ?)
источник

IZ

Ilia Zviagin in MySQL
Бородатый Таракан
create index IE_PAYMENTS_PAYER_REF_ACC on payments (payerSideReferencedAccountKey, documentDate);
create index IE_PAYMENTS_RECIPIENT_REF_ACC on payments (recipientSideReferencedAccountKey, documentDate);
create index IE_PAYMENTS_SERVICE_PAY_KEY on payments (servicePayKey);
Также нужна DDL на вторую таблицу, с индексами
источник

IZ

Ilia Zviagin in MySQL
Ilia Zviagin
Скажи, сколько в таблице строк, и сколько строк приходится на
указанные в запросе значения поля
p.payerSideReferencedAccountKey = ?
и сколько на
p.recipientSideReferencedAccountKey = ?)
В одном сообщении
запрос и индексы
select
 distinct p.cbsKey,
 (еще полей 70 эдак)
from payments p
join paymentCardIndex pci on p.cbsKey = pci.cbsKey and p.documentDate = pci.documentDate
where ( p.payerSideReferencedAccountKey = ? or p.recipientSideReferencedAccountKey = ?)

create index IE_PAYMENTS_PAYER_REF_ACC on payments (payerSideReferencedAccountKey, documentDate);
create index IE_PAYMENTS_RECIPIENT_REF_ACC on payments (recipientSideReferencedAccountKey, documentDate);
источник

S

Syntax Highlight Bot in MySQL
Ilia Zviagin
В одном сообщении
запрос и индексы
select
 distinct p.cbsKey,
 (еще полей 70 эдак)
from payments p
join paymentCardIndex pci on p.cbsKey = pci.cbsKey and p.documentDate = pci.documentDate
where ( p.payerSideReferencedAccountKey = ? or p.recipientSideReferencedAccountKey = ?)

create index IE_PAYMENTS_PAYER_REF_ACC on payments (payerSideReferencedAccountKey, documentDate);
create index IE_PAYMENTS_RECIPIENT_REF_ACC on payments (recipientSideReferencedAccountKey, documentDate);
источник

IZ

Ilia Zviagin in MySQL
I'm
В продолжении ночного разговора:
EXPLAIN SELECT * FROM _cats_sync AS s, _items AS i  WHERE s.cat_id IN (109,152,153,156,157,158,214,163,166,140) AND s.status = 1 AND s.p_status = 1 AND s.id = i.id LIMIT 100;
1   SIMPLE   s   range   cat_id,id   cat_id   4   NULL  280   Using where

CREATE TABLE IF NOT EXISTS _cats_sync (
 id mediumint(8) unsigned NOT NULL,
 cat_id smallint(5) unsigned NOT NULL,
 status tinyint(1) unsigned NOT NULL,
 p_status tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE _cats_sync
 ADD UNIQUE KEY (cat_id,status,p_status,id),
 ADD KEY id (id);
Может быть то Using where; Using index (когда в EXPLAIN больше 500 ROWS), а может Using where просто
ПОпробуй поменять местами поля индекса.

ADD UNIQUE KEY (status,p_status,cat_id,id),
источник

I

I'm in MySQL
Ilia Zviagin
ПОпробуй поменять местами поля индекса.

ADD UNIQUE KEY (status,p_status,cat_id,id),
индекс юзается, можете пояснить почему?
источник

IZ

Ilia Zviagin in MySQL
I'm
индекс юзается, можете пояснить почему?
МАГИЯ!
источник

I

I'm in MySQL
это как в случае с BETWEEN все, что до него июзается в индексе, а уже после BETWEEN нет?
источник

IZ

Ilia Zviagin in MySQL
I'm
это как в случае с BETWEEN все, что до него июзается в индексе, а уже после BETWEEN нет?
Я не понял
источник

I

I'm in MySQL
Ну если X=1 AND Y = 2 AND Z BETWEEN 1 AND 100, то я заметил, что если индекс XYZ он используется, если ZXY то нет
источник

IZ

Ilia Zviagin in MySQL
I'm
индекс юзается, можете пояснить почему?
Я думаю, OR strategy тут достаточно дорога, а поскольку при помещении cat_id в конец можно сканировать диапазон индекса,
сервер именно так и сделал, от 109 до 166, отфильтровывая ненужные записи.
источник

I

I'm in MySQL
Ilia Zviagin
Я думаю, OR strategy тут достаточно дорога, а поскольку при помещении cat_id в конец можно сканировать диапазон индекса,
сервер именно так и сделал, от 109 до 166, отфильтровывая ненужные записи.
т.е. он выбрал тупо все с 109 по 166, а потом откинул лишнее... прикольно. Спасибо за пояснения
источник

I

I'm in MySQL
А когда значений в IN не много или они дельта макс-мин очень большая, то тогда бы он уже делал OR?
источник

IZ

Ilia Zviagin in MySQL
I'm
т.е. он выбрал тупо все с 109 по 166, а потом откинул лишнее... прикольно. Спасибо за пояснения
Я не знаю, что он выбрал, это у тебя в плане нарисовано.
Это было лишь предположение
источник

IZ

Ilia Zviagin in MySQL
I'm
А когда значений в IN не много или они дельта макс-мин очень большая, то тогда бы он уже делал OR?
может быть
источник