精华内容
下载资源
问答
  • MySQL max() 函数的需扫描where条件过滤后的所有行:在测试环境中重现:测试版本:Server version: 5.1.58-log MySQL Community Server (GPL)testtable表中的索引mysql> show index from testtable;+-----------+...

    MySQL max() 函数的需扫描where条件过滤后的所有行:

    在测试环境中重现:

    测试版本:Server version:        5.1.58-log MySQL Community Server (GPL)

    testtable表中的索引

    mysql> show index from testtable;

    +-----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

    | Table    | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |

    +-----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

    | testtable |          0 | PRIMARY    |            1 | id          | A        |          2 |    NULL | NULL  |      | BTREE      |        |

    | testtable |          1 | key_number |            1 | number      | A        |          2 |    NULL | NULL  | YES  | BTREE      |        |

    +-----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

    对比的sql为:

    select sql_no_cache  max(id) from testtable where number=98;

    select sql_no_cache id from testtable where number=98 order by id desc limit 1;

    查看执行计划:

    mysql> explain select sql_no_cache  max(id) from testtable where number=98;

    +----+-------------+-----------+------+---------------+------------+---------+-------+------+--------------------------+

    | id | select_type | table    | type | possible_keys | key        | key_len | ref  | rows | Extra                    |

    +----+-------------+-----------+------+---------------+------------+---------+-------+------+--------------------------+

    |  1 | SIMPLE      | testtable | ref  | key_number    | key_number | 5      | const |    4 | Using where; Using index |

    +----+-------------+-----------+------+---------------+------------+---------+-------+------+--------------------------+

    1 row in set (0.00 sec)

    mysql> explain select sql_no_cache id from testtable where number=98 order by id desc limit 1;

    +----+-------------+-----------+------+---------------+------------+---------+-------+------+--------------------------+

    | id | select_type | table    | type | possible_keys | key        | key_len | ref  | rows | Extra                    |

    +----+-------------+-----------+------+---------------+------------+---------+-------+------+--------------------------+

    |  1 | SIMPLE      | testtable | ref  | key_number    | key_number | 5      | const |    4 | Using where; Using index |

    +----+-------------+-----------+------+---------------+------------+---------+-------+------+--------------------------+

    1 row in set (0.00 sec)

    执行计划显示完全一样。

    其中,number为98 对应的记录有4行:

    mysql> select count(*) from testtable where number=98;

    +----------+

    | count(*) |

    +----------+

    |        4 |

    +----------+

    1 row in set (0.00 sec)

    执行前查看innodb_rows_read

    #innodb_rows_read  从InnoDB表读取的行数

    mysql> show global status like 'innodb_rows_read';

    +------------------+-------+

    | Variable_name    | Value |

    +------------------+-------+

    | Innodb_rows_read | 1022  |

    +------------------+-------+

    1 row in set (0.00 sec)

    执行sql1

    mysql> select sql_no_cache  max(id) from testtable where number=98;

    +---------+

    | max(id) |

    +---------+

    |      13 |

    +---------+

    1 row in set (0.00 sec)

    执行后查看innodb_rows_read,发现innodb_rows_read增加了4,即number为98 对应的记录有4行

    mysql> show global status like 'innodb_rows_read';

    +------------------+-------+

    | Variable_name    | Value |

    +------------------+-------+

    | Innodb_rows_read | 1026  |

    +------------------+-------+

    1 row in set (0.00 sec)

    执行sql2

    mysql> select sql_no_cache id from testtable where number=98 order by id desc limit 1;

    +----+

    | id |

    +----+

    | 13 |

    +----+

    1 row in set (0.00 sec)

    执行后查看innodb_rows_read,发现innodb_rows_read增加了1

    mysql> show global status like 'innodb_rows_read';

    +------------------+-------+

    | Variable_name    | Value |

    +------------------+-------+

    | Innodb_rows_read | 1027  |

    +------------------+-------+

    1 row in set (0.00 sec)

    测试得出:

    select sql_no_cache  max(id) from testtable where number=98;

    需要读取 number=98 的所有行,才能得到最大的id

    select sql_no_cache id from testtable where number=98 order by id desc limit 1;

    由于id是主键,number是第二索引,只需扫描1行即可得到最大的id

    请慎用max()函数,特别是频繁执行的sql,若需用到可转化为测试中的  order by id desc limit 1

    因为往往min()或者max()函数往往会造成全表扫描

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 这几天工作当中,在使用mysql数据库的时候,碰到了too many connections的问题和timeout expired的问题,经过尝试,稍作总结,希望能够帮到需要的朋友;在测试当中发现,1:too many connections的错误会在max pool size的值...

    这几天工作当中,在使用mysql数据库的时候,碰到了too many connections的问题和timeout expired的问题,经过尝试,稍作总结,希望能够帮到需要的朋友;

    在测试当中发现,

    1:too many connections的错误会在max pool size的值大于max_connections的值,而且连接池中的连接全部被占用,并且有新的连接请求的时候出现;

    2:timeout expired的错误会在max pool size的值小于max_connections的值,而且连接数达到max pool size的值,并且有新的连接请求的时候出现;

    对于第一种情况,可以通过修改MySql的最大连接数的配置来解决,修改方法就不细说了,网上一大堆;

    对于第二种情况,可以通过修改数据库连接字符串的配置来解决,涉及的两个属性名称为pooling和max pool size,pooling为布尔值,true,启用,false,不启用(启用连接池比不启用连接池的效率要高不少),max pool size为int值;

    基本上就是这样了,希望能够帮到有需要的朋友,文中若有什么地方不准确,不正确,不完整,也真心欢迎朋友们指教;

    原文:http://www.cnblogs.com/JosephBee/p/4517594.html

    展开全文
  • 解决这种类型问题的规范模式是使用内联视图,如下所示:SELECT t.firstName, t.Lastname, t.idFROM mytable tJOIN ( SELECT MAX(mx.id) AS max_idFROM mytable mx) mON m.max_id = t.id这只是获取指定结果的一种方法...

    您不能在同一查询的WHERE子句中引用聚合函数的结果(例如MAX())。

    解决这种类型问题的规范模式是使用内联视图,如下所示:

    SELECT t.firstName

    , t.Lastname

    , t.id

    FROM mytable t

    JOIN ( SELECT MAX(mx.id) AS max_id

    FROM mytable mx

    ) m

    ON m.max_id = t.id

    这只是获取指定结果的一种方法。还有其他一些方法可以得到相同的结果,其中一些可以比其他方法效率低得多。其他答案表明了这种方法:

    WHERE t.id = (SELECT MAX(id) FROM ... )

    有时,最简单的方法是将ORDER BY与LIMIT一起使用。 (请注意,此语法特定于MySQL)

    SELECT t.firstName

    , t.Lastname

    , t.id

    FROM mytable t

    ORDER BY t.id DESC

    LIMIT 1

    请注意,这只会返回一行;所以如果有不止一行具有相同的id值,那么这不会返回所有这些。 (第一个查询将返回具有相同id值的所有行。)

    这种方法可以扩展到获得多行,通过将其更改为LIMIT 5可以获得具有最高ID值的五行。

    请注意,此方法的性能特别取决于适用的索引可用(即,id为PRIMARY KEY或作为另一索引中的前导列)。合适的索引将使用所有这些方法来提高查询的性能。

    展开全文
  • mysql case when 查询一个效率问题

    千次阅读 2021-01-19 08:40:14
    第一种:SELECT`user`.username,`user`.email,`user`.id AS user_id,user_class.level_id,user_class.class_id AS cid,user_class.create_time AS bontime,class.graduation_time,class.offline_graduation_time,...

    第一种:

    SELECT

    `user`.username,

    `user`.email,

    `user`.id AS user_id,

    user_class.level_id,

    user_class.class_id AS cid,

    user_class.create_time AS bontime,

    class.graduation_time,

    class.offline_graduation_time,

    class.is_baidan,

    class. NAME AS class,

    class.period_id,

    class.offline_period_id,

    company. NAME AS branch,

    company.id AS bid

    FROM

    `user_class`

    INNER JOIN `user` ON user_class.user_id = `user`.id

    INNER JOIN class ON user_class.class_id = class.id

    LEFT JOIN company ON class.company_id = company.id

    LEFT JOIN period ON class.period_id = period.id

    WHERE

    class. DISABLE = 1

    AND class.is_baidan IN ('1', '2')

    AND `user_class`.level_id IN ('10', '12', '14')

    AND CASE

    WHEN is_baidan = 1 THEN

    class.graduation_time=0

    OR class.graduation_time > 1469980800

    WHEN is_baidan = 2 THEN

    class.offline_graduation_time = 0

    OR class.offline_graduation_time > 1469980800

    END;

    第二种:

    SELECT

    `user`.username,

    `user`.email,

    `user`.id AS user_id,

    user_class.level_id,

    user_class.class_id AS cid,

    user_class.create_time AS bontime,

    class.graduation_time AS eontime,

    class.offline_graduation_time,

    class.is_baidan,

    class. NAME AS class,

    class.period_id,

    class.offline_period_id,

    company. NAME AS branch,

    company.id AS bid

    FROM

    `user_class`

    INNER JOIN `user` ON user_class.user_id = `user`.id

    INNER JOIN class ON user_class.class_id = class.id

    LEFT JOIN company ON class.company_id = company.id

    LEFT JOIN period ON class.period_id = period.id

    WHERE

    class. DISABLE = 1

    AND `user_class`.level_id IN ('10', '12', '14')

    AND (

    (

    class.is_baidan = 1 AND

    (class.graduation_time = 0 OR class.graduation_time > 1469980800)

    )

    OR (

    class.is_baidan = 2 AND

    (class.offline_graduation_time=0 OR class.offline_graduation_time >1469980800)

    )

    );

    这两个sql语句查询结果相同,想问问到底是哪个好一点

    展开全文
  • mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的。下面我来介绍随机取数据一些优化方法。SELECT * FROM ...
  • +1;这个参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;增加max_connections参数的值,不会占用太多...我们先来看下如何查看当前mysqlmax_connection...
  • max_connections指MySQL的最大用户连接数,每个连接MySQL的用户均算作一个连接,MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_...
  • //永远休眠,但是永远持有连接池 Thread.sleep(Long.MAX_VALUE); } 读取类: public class GetClient { private void query() throws SQLException { System.out.println("start"); MysqlClient instance = ...
  • 在介绍具体的 SQL 调优的方法前,我们先来简单了解下 ...SQL及索引优化效果:硬件我们可以看出数据库 SQL 语句效率调优是最省成本效果最好的办法,也就是结构设计上的优化。本文我们就来谈谈 MySQL 中常用的 SQL 优化...
  • 1.在两者都不走索引的情况下,max效率更高,这点很好理解,max只需取最大值,order by还要做全部数据的排序,运算更复杂 下面说的就是重点了 2.两者谁走了索引谁更优,千万不要以为你设置了索引就一定会按你预期的去...
  • SQL及索引优化效果:硬件本文我们就来谈谈 MySQL 中常用的 SQL 优化方法,利用好这些方法会让你的 MySQL 效率提高提升至少 3 倍。1、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。•Type 列,连接类型。一...
  • 建个储存过程向表中插入10w条数据 create procedure p_test(pa int(11)) begin declare max_num int(11) default 100000; declare i int default 0; declare rand_num int; select count(id) into max_num from ...
  • SET max_length_for_sort_data = 1024SHOW VARIABLES LIKE ‘%max_length_for_sort_data%‘;查询:SELECT * FROM CS_COLUMNS ORDER BY table_name,column_name LIMIT 0,100错误代码: 1815Internal error: IDB-2015:...
  • mysql> select k, count(*) c from tbl group by k order by k limit 5;+---+---+| k | c |+---+---+| 2 | 3 || 4 | 1 || 5 | 2 || 8 | 1 || 9 | 1 |+---+---+5 rows in set (0.00 sec)mysql> explain select ...
  • 安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件...
  • 注:在执行SQL语句前加上explain可以查看MySQL的执行计划数据库:MySQL官方提供的sakila数据库Max优化:例如:查询最后支付时间explain select max(payment_date) from payment \G;查询的类型为simple,没有用到任何...
  • 本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下:1、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据: type列,连接类型。一个...
  • mysql数据库设计时将提出的问题和回答消息都放在了一张表格里(比较失败),在程序中需要查询当前未读消息和问题,使用了嵌套查询语句进行查询。刚开始时没有问题,但是过了大概1个月左右,应用变得非常慢,以为是...
  • 方法二中使用limit,需要limit的范围足够大能包括所有数据,并且每种分类只会显示一条数据,但是数据较多时运行效率要比方法三快上很多,方法三能够控制每种分类显示多少条数据,把N换成需要显示对应的数字即可。
  • select max('attr') from table group by attr2; 此时会发现获取到的数据不是最大/最小的; 问题根源: group by默认返回每一组的第一条数据(每一组的数据排序都是按默认顺序排序的),就算你添加order by作为排序...
  • MYSQL笔记-关于分组查询中的where和having效率问题 前言 最近在学习SQL语法时,遇到了一个where和having的效率问题,感觉非常值得注意,所以记录下来便于复习和与各位网友分享。 结论放前面 时间紧迫的同学可以直接...
  • 今天做项目遇到这个问题,本来想用mysql自带的随机函数来实现,但是想到这样做功能是实现了,但是效率真的好差!一下子想不到好的方法,就去网上找了一下,记录下来,好好研究学习一下。ID连续的情况下(注意不能带...
  • 上次我们说到mysql的一些sql查询方面的优化,包括查看explain执行计划,分析索引等等。今天我们分享一些 分析mysql表读写、索引等等操作的sql语句。闲话不多说,直接上代码:反映表的读写压力SELECT file_name AS ...
  • 本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下:1、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据:type列,连接类型。一个...
  • 上次我们说到mysql的一些sql查询方面的优化,包括查看explain执行计划,分析索引等等。 今天我们分享一些 分析mysql表读写、索引等等操作的sql语句。闲话不多说,直接上代码:-- 反映表的读写压力SELECT file_name ...
  • FROM tablename ORDER BY RAND() LIMIT 100查询效率极其低下,解释如下:works for small tables, but once the tables grow larger than 300,000records or so this will be very slow because MySQL will have to ...
  • 再看下,执行计划和执行时间: 总结:使用恰当的索引,是sql的效率倍增,类似sum的函数还有min(),max(),这些都需要在字段上建索引 MySQL巧建sum索引帮我们提高至少100%的效率 标签:.com 准备 code info table...
  • 下面的语句采用的是JOIN,mysql的论坛上有人使用 SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;复制代码 我测试了一下,需要0.5秒,速度也不错,但是...
  • 常用函数 聚合函数函数名 作用AVG() 返回某字段的平均值COUNT() 返回某字段的行数MAX() 返回某字段的最大值MIN() 返回某字段的最小值SUM() 返回字段的和用法:SELECT AVG(字段名) FROM 表名;SELECT COUNT...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,577
精华内容 31,830
关键字:

max效率mysql

mysql 订阅