我就是这么做的
# mysql --version
mysql Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using EditLine wrapper案例1:
CREATE TABLE `Foo2` (
`id` bigint(20) unsigned NOT NULL,
`column1` int(10) unsigned NOT NULL,
`column2` int(10) unsigned NOT NULL,
`column3` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `composite` (`column1`, `column2`, `column3`)
) ENGINE=InnoDB;
# BASH: for i in `seq 1 10000`; do mysql -uroot -p"password" -e "replace into foo_db.Foo2 (\`id\`,\`column1\`,\`column2\`,\`column3\`) values ($((i * 2)), ${i}, $((i + 1)), NOW());" >/dev/null 2>&1; done以及下面的解释和结果
explain select * from foo_db.Foo2 order by RAND() limit 5;

select count(*) from foo_db.Foo2;
# result : 10000案例2:
CREATE TABLE `Foo3` (
`id` bigint(20) unsigned NOT NULL,
`column1` int(10) unsigned NOT NULL,
`column2` int(10) unsigned NOT NULL,
`column3` datetime NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `composite` (`column1`, `column2`, `column3`)
) ENGINE=InnoDB;
# BASH: for i in `seq 1 10000`; do mysql -uroot -p"password" -e "replace into foo_db.Foo3 (\`id\`,\`column1\`,\`column2\`,\`column3\`) values ($((i * 2)), ${i}, $((i + 1)), NOW());" >/dev/null 2>&1; doneexplain select * from foo_db.Foo3 order by RAND() limit 5;

explain select `id` from foo_db.Foo3 order by RAND() limit 5;

select count(*) from foo_db.Foo3;
# result : 10000我不明白的几点
order by RAND()中使用不相关的composite键而possible_keys为null?select *的案例1不同,但是如果我选择select id,则行为与案例1相同?select id结果中没有使用主键id?部分帮助也将不胜感激。
发布于 2022-07-23 14:29:32
首先,让我列出一系列的事情。这些会处理你的一些问题。
优化器
SELECT *.SELECT *.现在请回答你的具体问题。
使用
SELECT *需要所有的列,但是现在有一些列不在二级索引.SELECT id中--正如上面提到的“最小的”。。
有些关联:有关获取表的随机子集的最快算法,请参见。
https://stackoverflow.com/questions/73087855
复制相似问题