Mysql Query performance - - PullRequest
       36

Mysql Query performance -

3 голосов
/ 09 ноября 2010

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

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 миллиона данных, есть ли лучший способ написать этот запрос?

Ответы [ 5 ]

1 голос
/ 09 ноября 2010
  1. Как сказал Алан

  2. Попробуйте счетчик (id) вместо этого должно быть быстрее.Это зависит от механизма базы данных, но, по моему опыту, использование * не всегда происходит быстрее.

1 голос
/ 10 ноября 2010

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

w.r.t. улучшая производительность этого конкретного запроса, составной индекс на

... KEY itemType_sysCreationDate (itemType, sysCreationDate) ...

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

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

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

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

0 голосов
/ 22 декабря 2010

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

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

0 голосов
/ 22 декабря 2010

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

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

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

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

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

...