MySQL InnoDB 慢 - 按案例排序
MySQL InnoDB Slow - Order By Case When
我有一个 table,其字段标志的值为 0、1 或 2。我需要对标志值为 2 的结果排序,然后是其余结果。
目前我正在使用 SELECT * FROM table ORDER BY CASE WHEN flag = 2 THEN 1 ELSE 0
,虽然这在 MyISAM 上运行良好(<0.1s),但在 InnoDB(我们正在转向的东西)上看起来非常慢(10k 行需要 9s)。
我试过 ORDER BY FIELD (flag, '2') DESC
,结果相似。
flag
有一个索引,如果我做一个简单的 ORDER BY flag DESC
,它的工作速度非常快,但这会优先考虑标志 1 而不是标志 0,这是我不想要的。
InnoDB 是否有任何有用的调整,或者是否有更有效的方式来排序这些结果?
你试过了吗?:
SELECT * FROM table ORDER BY (flag = 2) DESC
感谢您对排序问题的替代方法的想法。
但是,问题在于 my.ini
的 InnoDB 设置:
# 60-80 % of available RAM.
innodb_buffer_pool_size = 1024M
innodb_additional_mem_pool_size = 128M
# 25 % of buffer pool size.
innodb_log_file_size = 256M
innodb_log_buffer_size = 128M
似乎使用 InnoDB 需要一些配置 my.cnf
;我用惯了要求很少的MyISAM
显然有大量的阅读工作要做,包括下面的链接,但希望这会帮助其他人像我一样开始:
我有一个 table,其字段标志的值为 0、1 或 2。我需要对标志值为 2 的结果排序,然后是其余结果。
目前我正在使用 SELECT * FROM table ORDER BY CASE WHEN flag = 2 THEN 1 ELSE 0
,虽然这在 MyISAM 上运行良好(<0.1s),但在 InnoDB(我们正在转向的东西)上看起来非常慢(10k 行需要 9s)。
我试过 ORDER BY FIELD (flag, '2') DESC
,结果相似。
flag
有一个索引,如果我做一个简单的 ORDER BY flag DESC
,它的工作速度非常快,但这会优先考虑标志 1 而不是标志 0,这是我不想要的。
InnoDB 是否有任何有用的调整,或者是否有更有效的方式来排序这些结果?
你试过了吗?:
SELECT * FROM table ORDER BY (flag = 2) DESC
感谢您对排序问题的替代方法的想法。
但是,问题在于 my.ini
的 InnoDB 设置:
# 60-80 % of available RAM.
innodb_buffer_pool_size = 1024M
innodb_additional_mem_pool_size = 128M
# 25 % of buffer pool size.
innodb_log_file_size = 256M
innodb_log_buffer_size = 128M
似乎使用 InnoDB 需要一些配置 my.cnf
;我用惯了要求很少的MyISAM
显然有大量的阅读工作要做,包括下面的链接,但希望这会帮助其他人像我一样开始: