我如何在MySQL中请求帮助优化和修复查询?

hob*_*ave 12 mysql optimization

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';
Run Code Online (Sandbox Code Playgroud)

让我的眼睛流血.

此外,尝试描述您的架构通常如下所示:

我有一个表CrazyTable,其中一个列是一个日期,它有一个主键Foo_Key但我想使用column_bar的子串(在CrazyTable中)加入SOMETABLE,该子串与月亮的相位有关(我存储了它)在moon_phases中作为三次序列化的PHP数组).

这是我问的一个问题的例子,如果我没有按照下面的步骤操作,我将永远不会得到任何人的满意答复:我没有羞耻..

我将在下面回答最能帮助解决问题的方法.什么帮助

hob*_*ave 15

使用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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

使用\ 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)
Run Code Online (Sandbox Code Playgroud)

更好:

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)
Run Code Online (Sandbox Code Playgroud)

CAVEAT:\G显然将一行数据转换成几行.对于几行数据,这变得同样麻烦.做什么看起来最好.

使用外部pastebin来获取令人讨厌的大块数据:

让我们知道您的期望


  • 慢? - 我们不知道你的速度有多慢.秒,分钟,小时?它有助于了解.
  • 更快 - 我们也不知道.你对快速的期望是什么?
  • 频率 - 这是您计划只运行一次的查询吗?日常?一天数百或数千次?这有助于我们知道何时足够好.