SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.01.2012 14:52:03

ndbuser
Участник
Зарегистрирован: 27.01.2012
Сообщений: 5

MySQL Cluster 7.1.18 - проблема с индексами

Добрый день, мигрировали с кластера старой версии на новую 7.1.18. Столкнулись с проблемой, что не отрабатывают индексы в таблицах, операции совершаются большим лагом.

Пробовали:

- Бутали)
- Удаляли/добавляли индексы
- ALTER TABLE

Конфиг идентичен 1в1 со старым, ставили кластер с нуля, не апргрейдом.

Я готов уточнить все нужные технические детали для разбора, но пока склонен думать, что это баг новой версии(

Буду рад выслушать ваши идеи.

Неактивен

 

#2 30.01.2012 15:01:54

ndbuser
Участник
Зарегистрирован: 27.01.2012
Сообщений: 5

Re: MySQL Cluster 7.1.18 - проблема с индексами

Вдогонку - индексы тупят не везде, а выборочно, пока зависимостей не нашли.

Неактивен

 

#3 30.01.2012 16:15:34

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: MySQL Cluster 7.1.18 - проблема с индексами

Не работают быстро именно индексы или простые безындексные запросы тоже тормозят? Какая величина лага? Что говорит EXPLAIN? Используется ли DNS? Посмотрите strace -p для ndb, может быть он чего-то ждет.

Если бага, которую можно будет повторить с заданным содержимым таблицы, то на bugs.mysql.com

Неактивен

 

#4 30.01.2012 16:25:17

ndbuser
Участник
Зарегистрирован: 27.01.2012
Сообщений: 5

Re: MySQL Cluster 7.1.18 - проблема с индексами

explain говорит что индекс есть, но не хочет его использовать ни при use index, ни при force index

Неактивен

 

#5 30.01.2012 16:30:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: MySQL Cluster 7.1.18 - проблема с индексами

Приведите запрос и EXPLAIN

Неактивен

 

#6 30.01.2012 16:46:38

ndbuser
Участник
Зарегистрирован: 27.01.2012
Сообщений: 5

Re: MySQL Cluster 7.1.18 - проблема с индексами


EXPLAIN SELECT
                    s.`user_id`,
                    s.`user_subid`,
                    SUM(c.`iteration`=1) as first,
                    SUM(c.`iteration`=2) as second,
                    SUM(c.`iteration`=3) as third,
                    SUM(c.`iteration`>3) as more,
                    SUM(c.`user_amount`) as user_amount,
                    SUM(c.`user_amount`/c.`exchrate`) as user_us_amount,
                    s.`project_id`
                FROM
                    `tb_subscriptions` s,
                    `tb_member_codes` c FORCE INDEX(`subscription_id-iter`)
                WHERE
                    s.`date` between "2011-12-16 00:00:00" and "2011-12-16 23:59:59"
                    and c.`subscription_id` = s.`ID`
                GROUP BY
                    s.`user_subid`,
                    s.`project_id`;
+----+-------------+-------+--------+--------------------------+---------+---------+--------------------------------------+---------+-----------------------------------+
| id | select_type | table | type   | possible_keys            | key     | key_len | ref                                  | rows    | Extra                             |
+----+-------------+-------+--------+--------------------------+---------+---------+--------------------------------------+---------+-----------------------------------+
|  1 | SIMPLE      | c     | ALL    | subscription_id-iter     | NULL    | NULL    | NULL                                 | 6179122 | Using temporary; Using filesort   |
|  1 | SIMPLE      | s     | eq_ref | PRIMARY,date,for_rebills | PRIMARY | 4       | db_handler.c.subscription_id |       1 | Using where with pushed condition |
+----+-------------+-------+--------+--------------------------+---------+---------+--------------------------------------+---------+-----------------------------------+
2 rows in set



EXPLAIN SELECT
                    s.`user_id`,
                    s.`user_subid`,
                    SUM(c.`iteration`=1) as first,
                    SUM(c.`iteration`=2) as second,
                    SUM(c.`iteration`=3) as third,
                    SUM(c.`iteration`>3) as more,
                    SUM(c.`user_amount`) as user_amount,
                    SUM(c.`user_amount`/c.`exchrate`) as user_us_amount,
                    s.`project_id`
                FROM
                    `tb_subscriptions` s,
                    `tb_member_codes` c USE INDEX(`subscription_id-iter`)
                WHERE
                    s.`date` between "2011-12-16 00:00:00" and "2011-12-16 23:59:59"
                    and c.`subscription_id` = s.`ID`
                GROUP BY
                    s.`user_subid`,
                    s.`project_id`;
+----+-------------+-------+--------+--------------------------+---------+---------+--------------------------------------+---------+-----------------------------------+
| id | select_type | table | type   | possible_keys            | key     | key_len | ref                                  | rows    | Extra                             |
+----+-------------+-------+--------+--------------------------+---------+---------+--------------------------------------+---------+-----------------------------------+
|  1 | SIMPLE      | c     | ALL    | subscription_id-iter     | NULL    | NULL    | NULL                                 | 6178604 | Using temporary; Using filesort   |
|  1 | SIMPLE      | s     | eq_ref | PRIMARY,date,for_rebills | PRIMARY | 4       | db_handler.c.subscription_id |       1 | Using where with pushed condition |
+----+-------------+-------+--------+--------------------------+---------+---------+--------------------------------------+---------+-----------------------------------+
2 rows in set




EXPLAIN SELECT
                    s.`user_id`,
                    s.`user_subid`,
                    SUM(c.`iteration`=1) as first,
                    SUM(c.`iteration`=2) as second,
                    SUM(c.`iteration`=3) as third,
                    SUM(c.`iteration`>3) as more,
                    SUM(c.`user_amount`) as user_amount,
                    SUM(c.`user_amount`/c.`exchrate`) as user_us_amount,
                    s.`project_id`
                FROM
                    `tb_subscriptions` s FORCE INDEX(`date`),
                    `tb_member_codes` c
                WHERE
                    s.`date` between "2011-12-16 00:00:00" and "2011-12-16 23:59:59"
                    and c.`subscription_id` = s.`ID`
                GROUP BY
                    s.`user_subid`,
                    s.`project_id`;
+----+-------------+-------+-------+------------------------------------------------------------+-----------------+---------+-------------------------+-------+--------------------------------------------------------------------+
| id | select_type | table | type  | possible_keys                                              | key             | key_len | ref                     | rows  | Extra                                                              |
+----+-------------+-------+-------+------------------------------------------------------------+-----------------+---------+-------------------------+-------+--------------------------------------------------------------------+
|  1 | SIMPLE      | s     | range | date                                                       | date            | 8       | NULL                    | 78914 | Using where with pushed condition; Using temporary; Using filesort |
|  1 | SIMPLE      | c     | ref   | subscription_id,subscription_id-level,subscription_id-iter | subscription_id | 4       | db_handler.s.ID |    18 | Using where                                                        |
+----+-------------+-------+-------+------------------------------------------------------------+-----------------+---------+-------------------------+-------+--------------------------------------------------------------------+
2 rows in set

 



Тут 3 запроса

видно что по одному индексу всё - ок, по другому - нет, при том на старом кластере всё было ок при всех индексах

Неактивен

 

#7 30.01.2012 17:44:00

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: MySQL Cluster 7.1.18 - проблема с индексами

Используйте SELECT STRAIGHT_JOIN, чтобы зафиксировать порядок JOIN, который вам требуется. Тогда указание на индексы будет более эффективным

Неактивен

 

#8 30.01.2012 17:53:59

ndbuser
Участник
Зарегистрирован: 27.01.2012
Сообщений: 5

Re: MySQL Cluster 7.1.18 - проблема с индексами

А это вариант, спасибо, учитывая что так не пашет. Однако я бэнчмарки проводил на старом серваке/кластере ещё, обычном, у меня джойны проиграли.

Попробуем погонять завтра утром и сравнить, отпишусь по результату.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson