mysql查询优化-随机选择
CREATE TABLE `words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; delimiter ;; create procedure wordcreatedata() begin declare i int; set i=0; while i<100000 do insert into words(word) values(concat(char(97+(i div 1000)), char(97+(i % 1000 div 100)), char(97+(i % 100 div 10)), char(97+(i % 10)))); set i=i+1; end while; end;; delimiter ;
call
wordcreatedata();
需要用到临时表和排序
mysql> select word from words order by rand() limit 3; +------+ | word | +------+ | fce | | idga | | ?jcc | +------+ 3 rows in set (0.05 sec) mysql> explain select word from words order by rand() limit 3 ; +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+ | 1 | SIMPLE | words | NULL | ALL | NULL | NULL | NULL | NULL | 100460 | 100.00 | Using temporary; Using filesort | +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> select count(*) from words; +----------+ | count(*) | +----------+ | 100000 | +----------+ 1 row in set (0.03 sec)
mysql> select count(*) into @C from t; set @Y1 = floor(@C * rand()); set @Y2 = floor(@C * rand()); set @Y3 = floor(@C * rand()); select * from t limit @Y1,1; // 在应用代码里面取 Y1、Y2、Y3 值,拼出 SQL 后执行 select * from t limit @Y2,1; select * from t limit @Y3,1;
浙公网安备 33010602011771号