MySQL InnoDB慢 - 按案例排序

时间:2016-03-17 11:09:05

标签: mysql innodb

我有一个带有字段标志的表,其值为0,1或2.我需要先用标志值2排序结果,然后是剩余的结果。

目前我正在使用<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="wrapper"> <div id="loaderTable"></div> <table class="table-bordered table-striped table-condensed" width="100%"> <thead> <th>Data inizio</th> <th>Ora inizio</th> <th>Data fine</th> <th>Ora fine</th> <th>Attività</th> <th>Struttura</th> <th>Dettagli</th> <th>Salva evento</th> <th>Stato</th> </thead> <tbody> <tr> <td data-title="Data inizio" id="prest_data_inizio">12/04/2016</td> <td data-title="Ora inizio" id="prest_ora_inizio">09:00</td> <td data-title="Data fine" id="prest_data_fine">12/04/2016</td> <td data-title="Ora fine" id="prest_ora_fine">18:00</td> <td data-title="Attività" id="prest_attivita">Attività di ambulatorio</td> <td data-title="Struttura" id="prest_struttura">6</td> <td data-title="Dettagli" id="prest_dettagli"><a href="javascript:void(0);"><i class="fa fa-chevron-circle-down"></i></a></td> <td data-title="Salva evento" id="prest_salva"><a href="javascript:void(0);"><i class="fa fa-calendar"></i></a></td> <td data-title="Stato" id="prest_stato">9</td> </tr> <tr class="prest_dettagli_box"> <td data-title="Dettagli" colspan="9"> <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</span> </td> </tr> </tbody> <tfoot> </tfoot> </table> </div> </div> </div> </div>,虽然这在MyISAM上运行良好(<0.1s),但在InnoDB上看起来非常慢(10k行为9s)(我们正在转向)。 / p>

我尝试了SELECT * FROM table ORDER BY CASE WHEN flag = 2 THEN 1 ELSE 0,结果相似。

ORDER BY FIELD (flag, '2') DESC有一个索引,如果我做一个简单的flag,它的工作速度非常快,但这优先考虑那些标志为1而不是标志为0的人,这是我不想要的。

是否有任何可能有用的InnoDB调整,或者是否有更有效的方式来订购这些结果?

2 个答案:

答案 0 :(得分:0)

你试过吗?:

SELECT * FROM table ORDER BY (flag = 2) DESC

答案 1 :(得分:0)

感谢您对订购问题的替代方法的想法。

然而,问题在于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。

显然有大量的阅读材料,包括下面的链接,但希望这将有助于其他人开始,就像我自己一样:

MySQL Manual

One of Many Third Party Articles