文章目录
- 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');
- 执行查询sql
SELECT * FROM test LIMIT 5
,反复执行,发现结果一样,的确是按照主键,从小到大排序 - 继续,执行查询sql
select 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()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低!