Подтвердить что ты не робот

Как я могу обратиться за помощью к оптимизации и исправлению запросов в MySQL?

Вопросы MySQL - это некоторые из моих фаворитов в StackOverflow.

К сожалению, такие вещи:

SELECT foo, bar, baz, quux, frozzle, lambchops FROM something JOIN somethingelse ON 1=1 JOIN (SELECT * FROM areyouserious) v ON 0=5 WHERE lambchops = 'good';

сделайте мои глаза кровоточащими.

Кроме того, попытки описания вашей схемы часто повторяются так:

У меня есть таблица CrazyTable с столбцом, который является датой, и у него есть первичный ключ Foo_Key, но я хочу присоединиться к SOMETABLE, используя подстроку column_bar (которая находится в CrazyTable), которая относится к фазе луны ( который я храню в moon_phases как трехсерийный массив PHP).

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

Я отвечу ниже, чтобы помочь мне лучше всего получить лучший ответ на ваш вопрос. Что вам помогает?

4b9b3361

Ответ 1

Используйте команду SHOW CREATE TABLE


Это говорит мне больше о ваших таблицах, чем ваши слова:

mysql> show create table magic\G
*************************** 1. row ***************************
       Table: magic
Create Table: CREATE TABLE `magic` (
  `id` int(11) DEFAULT NULL,
  `what` varchar(255) DEFAULT NULL,
  `the` datetime DEFAULT NULL,
  `heck` text,
  `soup_is_good` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

CAVEAT. Если в вашей таблице имеется 70 столбцов, оставьте ненужные. Что необходимо?

  • Поля, добавленные в список
  • Поля SELECTed
  • Поля, которые указаны на странице

Используйте EXPLAIN


Это позволяет мне увидеть, как лучше всего оптимизировать ваш текущий, но предположительно медленный запрос:

mysql> explain select *     from magic\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: magic
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
        Extra: 
1 row in set (0.00 sec)

Использовать \G


Необходимость прокрутки вправо - это, как правило, неудобство.

Обычный

mysql> select * from magic;
+------------+-------------------------------+---------------------+-------------------+--------------+
| id         | what                          | the                 | heck              | soup_is_good |
+------------+-------------------------------+---------------------+-------------------+--------------+
| 1000000000 | A really long text string yay | 2009-07-29 22:28:17 | OOOH A TEXT FIELD |        100.5 | 
+------------+-------------------------------+---------------------+-------------------+--------------+
1 row in set (0.00 sec)

Лучше:

mysql> select * from magic\G
*************************** 1. row ***************************
          id: 1000000000
        what: A really long text string yay
         the: 2009-07-29 22:28:17
        heck: OOOH A TEXT FIELD
soup_is_good: 100.5
1 row in set (0.00 sec)

CAVEAT:\G, очевидно, превращает одну строку данных в несколько. Это становится столь же громоздким для нескольких рядов данных. Делайте то, что выглядит лучше всего.

Используйте внешний пастик для неприятно больших кусков данных:

Сообщите нам ваши ожидания


  • Медленное?. Мы не знаем, что медленно для вас. Секунды, минуты, часы? Это помогает знать.
  • Быстрее. Мы этого не знаем. Какое ваше ожидание быстро?
  • Частота. Это запрос, который вы планируете запускать только один раз? Ежедневно? Сотни или тысячи раз в день? Это помогает нам знать, когда это хорошо.

Ответ 2

Анализ процедуры

select * from yourtable procedure analyse()\G

Вышеприведенное позволит другим узнать значения max и min, хранящиеся в таблице. Это помогает.

Ответ 3

Зная, какие индексы у вас есть в соответствующих таблицах, важно, imo. Вы заявляете, что используете подстроку столбца column_bar в предложении where - вам может понадобиться денормализовать и сохранить эту подстроку в другом столбце, а затем проиндексировать ее. И снова мощность столбца может сделать его бесполезным с использованием индекса в этом столбце, если (например) есть только два различных значения. Для полезного видеоурока по передовой практике настройки производительности смотрите это youtube video от Jay Pipes.