3

У меня есть следующий запрос Mysqlпроизводительность Mysql Query -

explain SELECT count(*) as assetCount 
      FROM MdhRawAsset m 
     where sysCreationDate > date_add(now(), INTERVAL -1 DAY) 
      AND sysCreationDate <= now() 
      AND itemType = 'TS'; 

Результаты:

| id | select_type | table | type |possible_keys              
| 1 | SIMPLE  | m  | range | MdhRawAsset_on_sysCreationDate, MdhRawAsset_itemType    
--------------------------------------------------------------------- 
|Key       |Key_len | ref | rows | Extra  | 
MdhRawAsset_on_sysCreationDate| 8  | NULL | 53269 | Using where | 

Вопросы:

  1. Как я буду знать, время выполнения этого запроса?
  2. В таблице MdhRawAsset содержится 37,5 млн. Данных, есть ли лучший способ написать этот запрос?
+0

какая версия mysql вы используете? –

ответ

1
  1. Время выполнения запроса зависит от того, слишком много вопросов, чтобы определить, сколько времени это займет. Нагрузка на сервер, количество строк и т. Д. Лучшее, что вы можете сделать, это запустить его в типичной нагрузке и посмотреть, сколько времени потребуется.

  2. У вас, похоже, установлены правильные индексы, поэтому я не вижу лучшего способа оптимизации, но кто-то может знать лучше, чем я.

+0

действительно. 'Using where' сообщает нам, что это очень хороший план выполнения, и такой запрос будет выполнен через мгновение. – zerkms

1
  1. Как сказал Алан

  2. Количество Try (идентификатор), а это должно быть быстрее. Это зависит от механизма базы данных, но по моему опыту, не использующему *, всегда быстрее.

+0

Тонкая разница с COUNT (*) и COUNT (id): count (*) будет включать в себя NULL, тогда как count (id) исключит их. – beach

+0

COUNT (*) does ** not ** означает, что все столбцы в таблице должны быть прочитаны. Это просто означает подсчет каждой строки без учета значений. –

1

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

w.r.t. повышение эффективности этого конкретного запроса, соединение индекса на

... КЛЮЧ itemType_sysCreationDate (ItemType, sysCreationDate) ...

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

Кроме того, замена «now()» на явную строку даты, сгенерированную на прикладном уровне, позволит mysql использовать кеш-запрос запроса, если раньше он просматривал запрос, а таблица не обновлялась со времени последнего выполнения , И запрос все еще находится в его кеше. Не то, чтобы я выступал за кеш запросов MySQL. ;)

0

Сколько времени занимает данный момент для выполнения этого запроса? У вас много данных.

Если вы не можете реально улучшить запрос, возможно, вам нужно немного другое решение -

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

  2. Используйте сводные таблицы - если это отчет, который нарисован часто, то он может помочь использовать методы datawarehousing для ведения сводных таблиц.Вы можете либо обновлять сводные таблицы «на лету» (когда происходит транзакция), либо периодически (если актуальная информация не нужна).

Обратите внимание, что когда вы помещаете данные в сводные таблицы, вам необязательно делать полный счет всегда - например. каждую новую запись, которую вы добавляете в таблицу транзакций, просто выполните существующий_summary_count = existing_summary_count + 1, и вы получите добавочное значение для сводки, не выполняя дорогостоящий запрос.

0

Вы должны думать о плане запроса с сервера MS-SQL, который, если память обслуживает, упоминает что-то о времени. Факт в том, что это дерьмо в любом случае. Чтобы выяснить, будет ли запрос выполняться так быстро, как это возможно, вам понадобится комбинация show index from <table> и explain ....

Ваш запрос будет самым быстрым с индексом itemType и sysCreationDate. Это позволило бы подсчитать последовательный ряд записей индекса.