Страница 1 из 1

MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-23 15:27:52
sasha181
Вот столкнлся с аким явлением. На больших базах типа MyISAM не всегда считаются индексы. Показывает что уникальных элементов в индексе ноль. Хотя они должны там быть.
На одну такую базу попробовал перевести на innodb и элементы в индексе появились.
Это недостаток MyISAM и ничего с этим не поделаешь. Или как-то это лечится?

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-23 17:36:08
zg
а где трабла? :smile:

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-24 9:34:54
sasha181
Да просто как-то странно себя ведёт таблица эта. В ней 28 тыс. записей (3гига) и много ключей (600метров). Всего один ключ имеен 28 тыс. уникальных элементов. Но при этом если cделать explain выборку по любому полю на которое есть ключ, показывает что ключ используется. Только какое бы поле не проверяли размер ключа равен 4. Поэтому и думаю что что-то не так.
У меня раньше была база. Там правда было порядка 3 миллионов записеи и размер самой базы метров 800. На MyISAM тоже такой глюк вылазил и тормозить начинало. Конвертнул её в innodb и проблема пропала. Просто всё же хочется разобраться в чём причина и как это исправить можно. Наверняка кто-то уже сталкивался с этим.
MySQL 5.1.40

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-24 11:17:00
zg
sasha181 писал(а):Только какое бы поле не проверяли размер ключа равен 4. Поэтому и думаю что что-то не так.
выложи структуру таблицы и результат explain :smile:

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-24 16:13:40
sasha181

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` mediumtext NOT NULL,
  `source` mediumtext NOT NULL,
  `comments` mediumtext NOT NULL,
  `text` longtext NOT NULL,
  `rubric_id` int(11) NOT NULL,
  `city_name` varchar(100) NOT NULL,
  `city_id` int(11) NOT NULL,
  `type` varchar(255) NOT NULL,
  `type_id` int(11) NOT NULL,
  `makedate` date NOT NULL,
  `number` varchar(255) NOT NULL,
  `last_id` int(11) NOT NULL,
  `p_flag` int(3) NOT NULL,
  `source_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `type` (`type`,`makedate`,`number`),
  KEY `rubric` (`rubric_id`),
  KEY `city` (`city_id`),
  KEY `makedate` (`makedate`),
  KEY `type_id` (`type_id`),
  KEY `last_id` (`last_id`),
  FULLTEXT KEY `title` (`title`),
  FULLTEXT KEY `text` (`text`),
  FULLTEXT KEY `number` (`number`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=30259 ;



mysql> show keys from `news` ;
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table          | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| news |          0 | PRIMARY  |            1 | id          | A         |       27568 |     NULL | NULL   |      | BTREE      |         |
| news |          0 | type     |            1 | type        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          0 | type     |            2 | makedate    | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          0 | type     |            3 | number      | A         |       27568 |     NULL | NULL   |      | BTREE      |         |
| news |          1 | rubric   |            1 | rubric_id   | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          1 | city     |            1 | city_id     | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          1 | makedate |            1 | makedate    | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          1 | type_id  |            1 | type_id     | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          1 | last_id  |            1 | last_id     | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| news |          1 | title    |            1 | title       | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |
| news |          1 | text     |            1 | text        | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |
| news |          1 | number   |            1 | number      | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
12 rows in set (0.00 sec)


mysql> EXPLAIN SELECT * FROM `news` WHERE `rubric_id` = 1 AND makedate = 1 AND number = 1;
+----+-------------+----------------+------+------------------------+--------+---------+-------+------+-------------+
| id | select_type | table          | type | possible_keys          | key    | key_len | ref   | rows | Extra       |
+----+-------------+----------------+------+------------------------+--------+---------+-------+------+-------------+
|  1 | SIMPLE      | news | ref  | rubric,makedate,number | rubric | 4       | const |    1 | Using where |
+----+-------------+----------------+------+------------------------+--------+---------+-------+------+-------------+
1 row in set, 2 warnings (0.20 sec)


mysql> EXPLAIN SELECT * FROM `news` WHERE `rubric_id` = 1;
+----+-------------+----------------+------+---------------+--------+---------+-------+------+-------+
| id | select_type | table          | type | possible_keys | key    | key_len | ref   | rows | Extra |
+----+-------------+----------------+------+---------------+--------+---------+-------+------+-------+
|  1 | SIMPLE      | news | ref  | rubric        | rubric | 4       | const |    1 |       |
+----+-------------+----------------+------+---------------+--------+---------+-------+------+-------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `city_id` = 1;
+----+-------------+----------------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+----------------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | news | ref  | city          | city | 4       | const |    1 |       |
+----+-------------+----------------+------+---------------+------+---------+-------+------+-------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `makedate` = 1;
+----+-------------+----------------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table          | type | possible_keys | key      | key_len | ref   | rows | Extra       |
+----+-------------+----------------+------+---------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | news | ref  | makedate      | makedate | 3       | const | 6780 | Using where |
+----+-------------+----------------+------+---------------+----------+---------+-------+------+-------------+
1 row in set, 3 warnings (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `type_id` = 1;
+----+-------------+----------------+------+---------------+---------+---------+-------+------+-------+
| id | select_type | table          | type | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+----------------+------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | news | ref  | type_id       | type_id | 4       | const |    1 |       |
+----+-------------+----------------+------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `last_id` = 1;
+----+-------------+----------------+------+---------------+---------+---------+-------+------+-------+
| id | select_type | table          | type | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+----------------+------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | news | ref  | last_id       | last_id | 4       | const |    1 |       |
+----+-------------+----------------+------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `title` like 1;
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | news | ALL  | title         | NULL | NULL    | NULL | 27568 | Using where |
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `text` = 1;
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | news | ALL  | text          | NULL | NULL    | NULL | 27568 | Using where |
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `news` WHERE `number` = 1;
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | news | ALL  | number        | NULL | NULL    | NULL | 27568 | Using where |
+----+-------------+----------------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.01 sec)

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-24 17:19:41
zg
:smile: в принципе всё ок. Длина 4 - это количество байт, которые читаются из индекса, для типа int оно 4.

я бы под сомнение поставил полнотекстовый индекс number, он явно не нужен, а также уникальный индекс type, который включает в себя number длиной 255 символов на полную катушку. Ничего удивительного нет, в том что это всё тормозит.

плюс полнотекстовыми индексами надо правильно пользоваться, чтобы они работали, иначе толку от них никакого нет. А лучше и вовсе отказаться в пользу ключевиков, поскольку fullindex работает правильно по-моему только с инглишем.

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-24 17:31:00
sasha181
Ясно. Большое Вам спасибо за помощь.
А то что нет уникальных элементов по ключам, это правильно? Так судя по содержимому этих полей, они там везде должны быть.

Re: MyISAM Уникальных элементов в индексе ноль, это нормально?

Добавлено: 2009-11-24 18:11:38
zg
sasha181 писал(а):А то что нет уникальных элементов по ключам, это правильно?
думаю да, иногда, чтобы избежать лишней нагрузки, она просто не считается. Но если есть сомнения, можно выполнить проверку таблицы или пересоздать индексы.

По первичному ключу и уникальному type она есть, а по остальным полям её и не нужно считать :)