即使语句中的说明另有说明,为什么mysql Query运行缓慢?

时间:2019-03-27 10:06:21

标签: mysql amazon-rds amazon-rds-aurora

这是我的查询

SELECT 
    id
FROM
    `MyTable`
WHERE
    `env` = 'default'
        AND (`HTML` = '' OR `HTML` IS NULL)
order by `id` desc 
limit 100;

关于它的运行解释,我会得到:

Possible keys: idx_env  (related to env field in where clause)
Key: id
Key length: 4
Rows: 200
Filtered: 9.50
Extra: using where

根据上面的解释,我了解到mySQL将检查200条记录。 并且应该没有大的性能问题

但是我经常遇到的是50“的慢查询,实际上在我的Aurora群集上激活慢查询日志时,我看到以下报告:

 # Query_time: 49.512712 Lock_time: 0.000065 Rows_sent: 28 Rows_examined: 6795665

似乎没有一致的反馈:表格中解释的检查行是所有记录中的200条记录...

编辑

env和id字段已被索引。 HTML没有被故意索引,因为它是LONGTEXT类型

我还想补充一点,有时在工作台上运行查询时,它可以按预期的那样很快地答复,但是执行它通常需要50英寸左右的时间。...我对此感到有些困惑

1 个答案:

答案 0 :(得分:0)

我不知道您在这里使用了什么实际索引,但这可能是可以改善查询性能的索引:

CREATE INDEX idx ON MyTable (env, HTML, id);

这将使MySQL使用两个字段来有效地过滤WHERE子句中的匹配项。并且此索引还覆盖了id,您可以选择该id并将其用于排序。请注意,如果CREATE INDEX idx ON MyTable (env, HTML); 是主键,并且您正在使用InnoDB引擎,则可以将索引简化为以下内容:

    public static class Example extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        JSONObject postdata = new JSONObject();
        try {
            AppUtill.getJsonWithHTTPPost(context, 1, new ServiceCallBack() {
                @Override
                public void serviceCallback(int id, JSONObject jsonResult) {
                    try {
                        if (jsonResult.getString("Status").equalsIgnoreCase("Success")) {
                            JSONObject jsonObject = jsonResult.getJSONObject("Data");
                            String apptime = jsonObject.optString("apptime");
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            String currentDateandTime = sdf.format(new Date());
                            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            Calendar calendar1 = Calendar.getInstance();
                            Calendar calendar2 = Calendar.getInstance();

                            Date date1 = dateFormat.parse(apptime);
                            Date date2 = dateFormat.parse(currentDateandTime);

                            calendar1.setTime(date1);
                            calendar2.setTime(date2);

                            long diff = date1.getTime() - date2.getTime();
                            long seconds = diff / 1000;

                            calendar2.add(Calendar.SECOND, (int) seconds);
                            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
                            new_date = "FoodHIT" + sdf1.format(calendar2.getTime());
                            new_date = encryptStringmd5(new_date);
                            System.out.println("Compare Result : " + seconds);
                            System.out.println("AppTime: " + jsonObject.optString("apptime"));
                            System.out.println("token : " + new_date);

                            Prefs.putString("security_token", new_date);

                            Log.e("NNNNNNNNNNNNNNNN",""+ new_date);
                        } else {
                            Toast.makeText(context, jsonResult.getString("Message"), Toast.LENGTH_SHORT).show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
            }, AppUtill.getapptime, postdata);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return new_date;
    }


    @Override
    protected void onPostExecute(String result) {
        // execution of result of Long time consuming operation
      new_date=result;
    }


}