2

mysql sql语句限制参数 -m6米乐安卓版下载

原创 hulong cui 2022-08-07
2227

经常了解到mysql使用过程中,因为这个那个sql语句导致系统负载高,变慢等问题。可以说数据库性能问题90%以上是不良sql引起的。前期发现不了,一旦压力负载上来,问题就爆发。

应对这种情况,规定了开发规范,并且起到了很大的限制作用,但由于疏忽或大意,往往会存在漏网之鱼;

对于这样的情况mysql也有一些控制手段。另外一方面也是为了提高sql性能考虑。这些参数非常有意思的。

限制select语句返回的行数,好处是长时间sql,io,网络资源有效的限制。当参数设置一定范围,就需要告知使用者,做了限制。

mysql> select.* from employees e limit 10; -------- ------------ ------------ ----------- -------- ------------ | emp_no | birth_date | first_name | last_name | gender | hire_date | -------- ------------ ------------ ----------- -------- ------------ | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10002 | 1964-06-02 | bezalel | simmel | f | 1985-11-21 | | 10003 | 1959-12-03 | parto | bamford | m | 1986-08-28 | | 10004 | 1954-05-01 | chirstian | koblick | m | 1986-12-01 | | 10005 | 1955-01-21 | kyoichi | maliniak | m | 1989-09-12 | | 10006 | 1953-04-20 | anneke | preusig | f | 1989-06-02 | | 10007 | 1957-05-23 | tzvetan | zielinski | f | 1989-02-10 | | 10008 | 1958-02-19 | saniya | kalloufi | m | 1994-09-15 | | 10009 | 1952-04-19 | sumant | peac | f | 1985-02-18 | | 10010 | 1963-06-01 | duangkaew | piveteau | f | 1989-08-24 | -------- ------------ ------------ ----------- -------- ------------ 10 rows in set (0.00 sec) mysql> show variables like '%sql_select_limit%'; ------------------ ---------------------- | variable_name | value | ------------------ ---------------------- | sql_select_limit | 18446744073709551615 | ------------------ ---------------------- 1 row in set (0.00 sec) #只返回一行 mysql> set session sql_select_limit=1; query ok, 0 rows affected (0.00 sec) mysql> select e.* from employees e ; -------- ------------ ------------ ----------- -------- ------------ | emp_no | birth_date | first_name | last_name | gender | hire_date | -------- ------------ ------------ ----------- -------- ------------ | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | -------- ------------ ------------ ----------- -------- ------------ #当加入limit 限制无效 mysql> select e.* from employees e limit 5; -------- ------------ ------------ ----------- -------- ------------ | emp_no | birth_date | first_name | last_name | gender | hire_date | -------- ------------ ------------ ----------- -------- ------------ | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10002 | 1964-06-02 | bezalel | simmel | f | 1985-11-21 | | 10003 | 1959-12-03 | parto | bamford | m | 1986-08-28 | | 10004 | 1954-05-01 | chirstian | koblick | m | 1986-12-01 | | 10005 | 1955-01-21 | kyoichi | maliniak | m | 1989-09-12 | -------- ------------ ------------ ----------- -------- ------------ 5 rows in set (0.00 sec)

sql_safe_updates分会话级别和全局级别,避免delete与update语句全表操作,上升为表锁。当然where条件不走索引的情况,也会一样效果。所以where条件后面 必须索引。

mysql> show variables like 'sql_safe_updates'; ------------------ ------- | variable_name | value | ------------------ ------- | sql_safe_updates | off | ------------------ ------- 1 row in set (0.00 sec) mysql> set session sql_safe_updates=on; query ok, 0 rows affected (0.00 sec) mysql> update employees set gender='m'; error 1175 (hy000): you are using safe update mode and you tried to update a table without a where that uses a key column.

select语句的执行超时,以毫秒为单位。如果该值为0,则不启用超时。
返回大数据量的语句持续时间过长,导致资源占有,队列越来越长。cpu负载上去,mysql服务无法访问。这是典型的问题。

mysql> set session max_execution_time=1; query ok, 0 rows affected (0.00 sec) mysql> show variables like 'max_execution_time'; -------------------- ------- | variable_name | value | -------------------- ------- | max_execution_time | 1 | -------------------- ------- 1 row in set (0.00 sec) mysql> select e.* from employees e ; error 3024 (hy000): query execution was interrupted, maximum statement execution time exceeded
  • 当sql_big_selects值设置为off时, mysql将中止可能需要很长时间执行的select语句(即那些优化器估计所检查的行数超过max_join_size值的语句)。
  • 不允许执行超过max_join_size rows的语句。
mysql> select e.* from employees e inner join salaries s on e.emp_no=s.emp_no limit 10; -------- ------------ ------------ ----------- -------- ------------ | emp_no | birth_date | first_name | last_name | gender | hire_date | -------- ------------ ------------ ----------- -------- ------------ | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | | 10001 | 1953-09-02 | georgi | facello | m | 1986-06-26 | -------- ------------ ------------ ----------- -------- ------------ 10 rows in set (0.00 sec) #进行限制 mysql> set session max_join_size=5; #限制提示 mysql> select e.* from employees e inner join salaries s on e.emp_no=s.emp_no limit 10; error 1104 (42000): the select would examine more than max_join_size rows; check your where and use set sql_big_selects=1 or set max_join_size=# if the select is okay

mysql 8.0.28用户连接内存限制,设置单个用户连接可以使用的最大内存量(16mb~)。如果任何用户连接使用超过这个数量,任何来自该连接的新查询都会被er_conn_limit拒绝。

  • 此限制不适用于系统用户或root帐户;
  • innodb缓冲池使用的内存也不包括在内。

就是说限制临时内存,排序,链接等内存。应对所有用户(除root)

mysql> set global connection_memory_limit=2097152; mysql> select count(*) from employees group by gender; error 4082 (hy000): connection closed. connection memory limit 2097152 bytes exceeded. consumed 1094948 bytes.

在无法用开发规范限制的情况下, sql限制参数,能避免低质量的sql写法。当然需要结合实际情况,并且跟开发人员达成一致下合理设置。

最后修改时间:2022-12-27 13:29:04
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图