Выберите SQL-запрос не работает с простым, где clouse - PullRequest
0 голосов
/ 03 мая 2019

Это одна таблица Mysql Table, на которой не работает простой sql, где date = 'Some date'

Проверили логи.Перезагрузите таблицы несколько раз и попытались.

Это доказательство того, что запись существует: -

select * from TRN_RP_CONSUMPTION_DAILY limit 1;

+------------+------------------------+----------------------+------------------------+----------------+-------------------+-----------------+-------------------+----------------------+--------------------+----------------------+-------------------+-----------------+---------------+--------------+
| TRCD_DATE  | TRCD_SPREAD_START_DATE | TRCD_SPREAD_END_DATE | TRCD_SOURCE_CHENNEL_ID | TRCD_CIRCLE_ID | TRCD_CATALOUGE_ID | TRCD_CONTENT_ID | TRCD_SONG_CODE_ID | TRCD_YT_CP_POLICY_ID | TRCD_YT_CHANNEL_ID | TRCD_PRODUCT_NAME_ID | TRCD_TRXN_TYPE_ID | TRCD_TRXN_COUNT | TRCD_TOP_LINE | TRCD_REVENUE |
+------------+------------------------+----------------------+------------------------+----------------+-------------------+-----------------+-------------------+----------------------+--------------------+----------------------+-------------------+-----------------+---------------+--------------+
| 2018-01-01 | 2018-01-01             | 2018-01-04           |                      5 |              1 |                 1 |          945723 |                 1 |                    1 |                  1 |                  211 |               180 |            1.75 |             0 |            0 |
+------------+------------------------+----------------------+------------------------+----------------+-------------------+-----------------+-------------------+----------------------+--------------------+----------------------+-------------------+-----------------+---------------+--------------+

Это доказательство того, что индекс на дату существует: -

select * from TRN_RP_CONSUMPTION_DAILY limit 1;
CREATE TABLE `TRN_RP_CONSUMPTION_DAILY` (
  `TRCD_DATE` date NOT NULL DEFAULT '0000-00-00',
  `TRCD_SPREAD_START_DATE` date NOT NULL DEFAULT '0000-00-00',
  `TRCD_SPREAD_END_DATE` date NOT NULL DEFAULT '0000-00-00',
  `TRCD_SOURCE_CHENNEL_ID` smallint(5) unsigned NOT NULL DEFAULT '1',
  `TRCD_CIRCLE_ID` smallint(5) unsigned NOT NULL DEFAULT '1',
  `TRCD_CATALOUGE_ID` int(10) unsigned NOT NULL DEFAULT '1',
  `TRCD_CONTENT_ID` int(10) unsigned NOT NULL DEFAULT '1',
  `TRCD_SONG_CODE_ID` int(10) unsigned NOT NULL DEFAULT '1',
  `TRCD_YT_CP_POLICY_ID` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `TRCD_YT_CHANNEL_ID` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `TRCD_PRODUCT_NAME_ID` smallint(5) unsigned NOT NULL DEFAULT '1',
  `TRCD_TRXN_TYPE_ID` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `TRCD_TRXN_COUNT` double NOT NULL DEFAULT '0',
  `TRCD_TOP_LINE` double NOT NULL DEFAULT '0',
  `TRCD_REVENUE` double NOT NULL DEFAULT '0',
  KEY `IDX_TRCD_DATE` (`TRCD_DATE`),
  KEY `IDX_TRCD_SOURCE_CHENNEL_ID` (`TRCD_SOURCE_CHENNEL_ID`),
  KEY `IDX_TRCD_CATALOUGE_ID` (`TRCD_CATALOUGE_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Это проблема, она должна давать некоторое количество, но оно не приходит (см. Результат 1-го запроса выше, данные присутствуют): -

select count(*) from TRN_RP_CONSUMPTION_DAILY where TRCD_DATE='2018-01-01';

+----------+
| count(*) |
+----------+
|        0 |
+----------+

Доказательство того, что он использует индекс: -

explain select count(*) from TRN_RP_CONSUMPTION_DAILY where TRCD_DATE='2018-01-01';
+----+-------------+--------------------------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table                    | type | possible_keys | key           | key_len | ref   | rows | Extra       |
+----+-------------+--------------------------+------+---------------+---------------+---------+-------+------+-------------+
|  1 | SIMPLE      | TRN_RP_CONSUMPTION_DAILY | ref  | IDX_TRCD_DATE | IDX_TRCD_DATE | 3       | const |    1 | Using index |
+----+-------------+--------------------------+------+---------------+---------------+---------+-------+------+-------------+

Индекс силы также не работает: -

select count(*) from TRN_RP_CONSUMPTION_DAILY FORCE INDEX(IDX_TRCD_DATE) where TRCD_DATE='2018-01-01';
+----------+
| count(*) |
+----------+
|        0 |
+----------+

Да, его огромный стол: -

select count(*) from TRN_RP_CONSUMPTION_DAILY;
+------------+
| count(*)   |
+------------+
| 2006275044 |
+------------+

Таблица и индекс Размер: -

103G= TRN_RP_CONSUMPTION_DAILY.MYD

52G = TRN_RP_CONSUMPTION_DAILY.MYI

Удивительно, но это работает, но я не могу использовать вот так: -

select count(*) from TRN_RP_CONSUMPTION_DAILY where date(TRCD_DATE)='2018-01-01';
+----------+
| count(*) |
+----------+
|  1235523 |
+----------+
* 1033Это работает, потому что индекс не будет учитываться при использовании функции для этого индексированного столбца.

Какой сервер Percona: -

Версия сервера: 5.5.60-38.12-log Percona Server(GPL), выпуск 38.12, редакция 26ef816

Ничего не появляется в журнале ошибок и предупреждений mysql при запросеотсчет нуля.

Где clouse в другом столбце, в котором есть индекс, который работает должным образом.Может кто-нибудь помочь, почему это не работает в этой колонке даты?Я хочу добавить еще несколько индексов для этой таблицы, но это не работает, поэтому я остановлюсь здесь.

Ответы [ 3 ]

0 голосов
/ 03 мая 2019

У вас есть таблица в качестве даты, но это дата или дата / время.Может быть, происходит сбой EXACT?

Как насчет изменения условия where на

where TRCD_DATE >='2018-01-01' AND TRCD_DATE < '2018-01-02' 

Таким образом, вы получаете что-либо с 12:00 (утро) вплоть до 23:59:59 вечера?до следующего дня.Не пытайтесь преобразовать столбец данных, это предотвратит использование индекса.

0 голосов
/ 03 мая 2019

Переход от MyISAM к InnoDB.

Между тем, один из них должен работать.(Перейдите вниз по списку, пока не получите пригодную для использования таблицу. Большинство параметров работают медленно, поскольку включают копирование таблицы.)

  • CHECK TABLE TRN_RP_CONSUMPTION_DAILY; сообщает об ошибке, выполните REPAIR TABLE TRN_RP_CONSUMPTION_DAILY;.

  • OPTIMIZE TABLE TRN_RP_CONSUMPTION_DAILY;

  • REPAIR TABLE TRN_RP_CONSUMPTION_DAILY USE_FRM;

  • DROP INDEX ... (для каждого индекса), затемADD INDEX ...

  • скопировать таблицу поверх:

    CREATE TABLE new LIKE real;
    INSERT INTO new SELECT * FROM TRN_RP_CONSUMPTION_DAILY;
    RENAME TABLE TRN_RP_CONSUMPTION_DAILY TO old,
          new TO TRN_RP_CONSUMPTION_DAILY;
    DROP TABLE old;
    
  • Восстановить из резервной копии?

Это те вещи, которые иногда необходимы для таблиц MyISAM;InnoDB более надежен.

0 голосов
/ 03 мая 2019

Вы пытались использовать функцию STR_TO_DATE MySQL в предложении where?

В вашем случае: TRCD_DATE = STR_TO_DATE ('2018-01-01', '% Y,% m,%d ') (или обратный% m и% d)

Для получения дополнительной информации: https://www.w3schools.com/sql/func_mysql_str_to_date.asp

Я надеюсь, что это ответ на вашу проблему / вопрос.

...