Как мне обратиться за помощью в оптимизации и исправлении запросов в MySQL? - PullRequest
12 голосов
/ 30 июля 2009

Вопросы 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).

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

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

Ответы [ 3 ]

15 голосов
/ 30 июля 2009

Использовать 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 столбцов, опустите ненужные . Что нужно?

  • Поля, к которым присоединился
  • Выбранные поля
  • Поля, ГДЕ

Использовать 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 голосов
/ 30 июля 2009

Процедура анализа

select * from yourtable procedure analyse()\G

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

0 голосов
/ 30 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...