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高效率随机取一条或多条数据

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章