mysql排序规则引发的一系列问题

    xiaoxiao2025-01-15  12

    文章目录

    mysql排序规则引发的一系列问题背景mysql默认的排序方式mysql默认排序真的是按照主键进行排序的吗?如何随机获取更优?

    mysql排序规则引发的一系列问题

    背景

    项目中提出需求,获取到业务数据之后,需要随机抽选五条,即mysql随机获取表中5条数据。

    mysql默认的排序方式

    mysql常用存储引擎MyISAM和InnoDB

    查看表的存储引擎:show create table xxx

    从MySQL5.5.5以后,InnoDB是默认引擎myisam引擎表在没有任何的删除,修改操作下,执行 select 不带order by,那么会按照插入顺序进行排序。对于innodb引擎表来说,在相同的情况下,select 不带order by,会根据主键来排序,从小到大

    MySQL存储引擎之MyIsam和Innodb总结性梳理

    mysql默认的排序方式

    mysql默认排序真的是按照主键进行排序的吗?

    建表: CREATE TABLE `test` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` char(100) DEFAULT NULL, `age` char(5) DEFAULT NULL, PRIMARY KEY (`id`), KEY `age` (`age`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 准备测试数据: INSERT INTO test VALUES(NULL,'张三','5'); INSERT INTO test VALUES(NULL,'李四','15'); INSERT INTO test VALUES(NULL,'王五','5'); INSERT INTO test VALUES(NULL,'赵信','15'); INSERT INTO test VALUES(NULL,'德玛','20'); INSERT INTO test VALUES(NULL,'皇子','5'); INSERT INTO test VALUES(NULL,'木木','17'); INSERT INTO test VALUES(NULL,'好汉','22'); INSERT INTO test VALUES(NULL,'水浒','18'); INSERT INTO test VALUES(NULL,'小芳','17'); INSERT INTO test VALUES(NULL,'老王','5');

    执行查询sqlSELECT * FROM test LIMIT 5,反复执行,发现结果一样,的确是按照主键,从小到大排序

    继续,执行查询sqlselect id,age from test limit 5,返回的结果和第一次完全不同。

    分析

    -- 所有列 explain select * from test limit 5; id select_type table type possible_keys key key_len ref rows Extra -- ----------- ----- ---- ------------- ------ ------- ------ ---- ----- 1 SIMPLE test ALL (null) (null) (null) (null) 11 -- 仅id,age列 explain select id,age from test limit 5; id select_type table type possible_keys key key_len ref rows Extra -- ----------- ----- ----- ------------- --- ------- ------ ---- ----------- 1 SIMPLE test index (null) age 16 (null) 11 Using index

    分析结果:第一个查询语句是没有使用到任何的索引的,而第二个查询则是使用了age作为索引

    结论:可以看出,mysql在不给定order by条件的时候,得到的数据结果的顺序是跟查询列有关的。因为在不同的查询列的时候,可能会使用到不同的索引条件。Mysql在使用不同索引的时候,得到的数据顺序是不一样的。这个可能就跟Mysql的索引建立机制,以及索引的使用有关了。

    如何随机获取更优?

    方案一:SELECT * FROM table_name ORDER BY RAND() LIMIT 10;方案一结论:效率最慢,在 ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低!

    mysql高效率随机取一条或多条数据

    最优方案请参考:MySQL 中随机选择10条记录
    最新回复(0)