首页 > 数据库 >MySQL SQL限制参数

MySQL SQL限制参数

时间:2023-07-10 23:00:39浏览次数:38  
标签:02 1986 09 06 SQL 参数 1953 MySQL

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

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

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

sql_select_limit

限制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

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.

max_execution_time

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

max_join_size & sql_big_selects

  • 当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

connection_memory_limit

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写法。当然需要结合实际情况,并且跟开发人员达成一致下合理设置。

标签:02,1986,09,06,SQL,参数,1953,MySQL
From: https://blog.51cto.com/u_13482808/6681906

相关文章

  • mysql中innodb的索引结构以及使用B+树实现索引的原因?
    在MySQL中,InnoDB引擎使用B+树数据结构来实现索引。B+树是一种平衡的多叉树,它具有以下优点:有序性:B+树的叶子节点是按照键值大小顺序存储的,这样可以方便地进行范围查询操作,提高查询效率。平衡性:B+树通过自动调整节点的分裂和合并来保持树的平衡,使得所有叶子节点到根节点的路径长度相......
  • python: sqlalchemy ORM in mysql
     """StudengMaping.pyORM(ObjectRelationalMapping)学生表实体类对象关系映射one-oneone-moremore-onemore-moredate2023-06-23edit:GeovinDu,geovindu,涂聚文ide:PyCharm2023.1python11sqlalchemy2.0.1.6https://docs.sqlalchemy.org/en/20/cor......
  • Django 在终端打印 ORM 对应的 SQL 语句的两种方式
    前言在使用Django框架开发项目中,如果想知道使用ORM语句操作数据库转换对应的SQL语句时,那么可以使用两种方式来实现方法一在 Django 项目的 settings.py 文件中,找到日志配置LOGGING,没有找到日志配置项的直接复制粘贴如下代码即可配置好之后,重新运行项目,再执行任何对......
  • 2.mysql的索引
    一、索引概述索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。索引是帮助MySQL高效获取数据的排好序的数据结构。平时代码中为了方便查询,我们使用的哈希表、链表、二叉树等数据结构存储相关数据,使用二分、二叉搜......
  • python之数据库MySQL
    数据的演变史#以ATM为例#1.把数据存放在单个文件里面 1.文件名不规范2.数据格式也不规范 kevin|123kevin$123kevin*123#2.软件目录开发规范 db文件夹里 #当数据量多的时候,会产生很多的文件,多次读取文件会占用大量的资源#3.数据库阶段 把数据......
  • MYSQL--数据取整的方法
    在MySQL中,我们经常会需要取整数。本篇文章将详细介绍MySQL中取整数的多种方法。一、使用ROUND函数ROUND函数用于将一个数四舍五入到指定的小数位数。如果小数位数为0,则返回整数部分。 为小数位数。SELECTROUND(3.14159,0);--结果为3SELECTROUND(3.14159,1);--结果为......
  • sql记录:FIELD函数解决mysql中in传值顺序问题
    1.问题描述in查询的结果传值顺序与结果显示顺序不一致,默认对id进行排序显示结果,eg:如果是5号用户先点赞,1号用户后点赞,但是查询结果是1号用户显示在5号用户的前面,也就是说导致结果1号用户先点赞,5号用户后点赞,需要使用FIELD函数解决2.问题解决SELECTid,phone,password,nick_n......
  • 数据库mysql
    数据的演变史'''以ATM为例'''1.把数据存在了文件中文件名:user.txt、userinfo.txt数据格式:kevin|123、kevin@123、kevin!1232.软件开发目录规范db文件夹#专门用来存储数据文件,但是,当数据文件较多的时候,占用过多的资源,也会产生很多的文件......
  • 碎片对MySQL的影响
    常见的碎片类型·SegmentFragmentation:段产生了碎片;没有按照数据的顺序存储,或者在数据页之间有空的页·TablespaceFragmentation:表空间中存储的是非连续的文件系统块·TableFragmentation:表中数据不是按照主键的顺序存储的。或者表的页有大量空闲空间。比如,表定义成了堆......
  • openGauss学习笔记-05 openGauss gsql连接与使用方法
    openGauss学习笔记-05openGaussgsql连接与使用方法openGauss提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节主要介绍如何使用gsql本地连接数据库。您需要提供数据库的名称以及数据库主节点的端口号。5.......