Ali Razeghi - AWS Asked: 2018-07-18 15:46:47 +0800 CST2018-07-18 15:46:47 +0800 CST 2018-07-18 15:46:47 +0800 CST 使用 ProxySQL、QueryRewrite 或其他方法强制对 MySQL 查询进行限制 772 我有一个最终用户需要查询的系统,但不能保证他们精通查询编写。我们想确保每个 SELECT 语句都以 LIMIT 100000 结尾。我想到了一些正则表达式和一些工具来执行此操作。本机查询重写似乎是一个不错的选择,但我们需要将 ProxySQL 用于其他事情,因此我想看看是否有人知道强制执行此操作的方法。 模式或正则表达式似乎是这样的:以 select 开头的任何内容都需要在最后一行有一个 LIMIT,后跟一个空格和等于或小于 100000 的整数,然后可能是一个分号。 有没有人有幸这样做? mysql query 1 个回答 Voted Best Answer Rick James 2018-07-18T17:48:00+08:002018-07-18T17:48:00+08:00 忘了它。 有一些方法可以编写“简单”查询,即使是一个小的查询,也LIMIT可能需要数小时才能运行。 如何,如果你切换到 MariaDB-5.5.21(或更高版本),有一个“LIMIT ROWS EXAMINED”可以相对有效地阻止失控查询。 where的一个例子LIMIT没有多大帮助: SELECT ... FROM big_table WHERE lots_of_rows_kept GROUP BY one_column ORDER BY another_column LIMIT 1 它会 获取很多行。 GROUP BY,可能涉及所有行的一种。 再次排序,这次为ORDER BY。 交付一排。 也就是说,步骤 1、2、3 投入了大量时间和精力;决赛LIMIT对总时间的影响很小。 查看代理服务器——其中一些可能具有一项功能,即它们会杀死任何运行时间超过 X 秒的进程。 查询重写 我对查询重写的旧想法:http: //mysql.rjweb.org/doc.php/queryrewrite 最糟糕的是什么? 因此,有人编写了一个长时间运行的查询。它会占用一些资源并减慢其他查询的速度,但很可能不会以任何方式杀死系统。希望他下次不会感到尴尬并更加努力。 轶事 我处理过几个时间序列应用程序。我做的第一件事是建立一个网站来提供可能的信息。而且,在幕后,我构建了摘要表,以便对它们的查询比对原始(事实)表的查询更好(有时是 10 倍)。 与非程序员通过笨拙的 SQL 获取的数据相比,网页以更易于阅读的方式呈现数据。我可以测试它们,看看它们不会损害系统。当我完成时,我不必担心人们会访问我的网页,而这些网页又会访问十亿行的数据集。 是的,我LIMITs在不同的地方进行了构建——毕竟,谁想要滚动浏览一百万行的网页(它应该完成渲染)?我什至让他们能够更改我提供的正常默认值的限制。但他们很少这样做。 我听取他们的要求。我尝试快速构建他们要求的任何东西。(这使他们免于要求直接 SQL 访问。) 汇总表是成功的关键。他们不想要逐项结果;他们想要按天(或周或小时或......)的总和/平均值 对我来说,编写 SQL 比解释表的细微差别更容易。 而且,是的,总是有规范化,所以JOINs是必需的。
忘了它。 有一些方法可以编写“简单”查询,即使是一个小的查询,也
LIMIT
可能需要数小时才能运行。如何,如果你切换到 MariaDB-5.5.21(或更高版本),有一个“LIMIT ROWS EXAMINED”可以相对有效地阻止失控查询。
where的一个例子
LIMIT
没有多大帮助:它会
GROUP BY
,可能涉及所有行的一种。ORDER BY
。也就是说,步骤 1、2、3 投入了大量时间和精力;决赛
LIMIT
对总时间的影响很小。查看代理服务器——其中一些可能具有一项功能,即它们会杀死任何运行时间超过 X 秒的进程。
查询重写 我对查询重写的旧想法:http: //mysql.rjweb.org/doc.php/queryrewrite
最糟糕的是什么?
因此,有人编写了一个长时间运行的查询。它会占用一些资源并减慢其他查询的速度,但很可能不会以任何方式杀死系统。希望他下次不会感到尴尬并更加努力。
轶事
我处理过几个时间序列应用程序。我做的第一件事是建立一个网站来提供可能的信息。而且,在幕后,我构建了摘要表,以便对它们的查询比对原始(事实)表的查询更好(有时是 10 倍)。
与非程序员通过笨拙的 SQL 获取的数据相比,网页以更易于阅读的方式呈现数据。我可以测试它们,看看它们不会损害系统。当我完成时,我不必担心人们会访问我的网页,而这些网页又会访问十亿行的数据集。
是的,我
LIMITs
在不同的地方进行了构建——毕竟,谁想要滚动浏览一百万行的网页(它应该完成渲染)?我什至让他们能够更改我提供的正常默认值的限制。但他们很少这样做。我听取他们的要求。我尝试快速构建他们要求的任何东西。(这使他们免于要求直接 SQL 访问。)
汇总表是成功的关键。他们不想要逐项结果;他们想要按天(或周或小时或......)的总和/平均值
对我来说,编写 SQL 比解释表的细微差别更容易。
而且,是的,总是有规范化,所以
JOINs
是必需的。