我正在尝试获取1到2000万之间的序列号表。(或0到2000万)
对于要解决这个常见问题的MySQL兼容解决方案有多么困难,我感到非常震惊。
与此类似:在MySQL中创建“数字表”
但是答案只有一百万。我不是很了解位移计算。
我已经看到了许多SQL答案,但是大多数答案都是针对非MySQL的数据库,因此由于缺乏对MySQL和另一个MySQL的了解,所以我无法采用该代码。
请确保您发布的代码在MySQL中兼容并且以分号分隔,以便我可以在PhpMyAdmin中运行它。我很高兴用名为numbers
的列来命名该表i
我将对每个解决方案进行基准测试,因此已将其存档,并希望下次有人尝试搜索此问题时显示该解决方案。
迄今为止的基准:
时间以秒为单位。
+---------------+------------------+---------+-----------+------------+
| Author | Method | 10,000 | 1,000,000 | 20,000,000 |
+---------------+------------------+---------+-----------+------------+
| Devon Bernard | PHP Many Queries | 0.38847 | 39.32716 | ~ 786.54 |
| Bhare | PHP Few Queries | 0.00831 | 0.94738 | 19.58823 |
| psadac,Bhare | LOAD DATA | 0.00549 | 0.43855 | 10.55236 |
| kjtl | Bitwise | 1.36076 | 1.48300 | 4.79226 |
+---------------+------------------+---------+-----------+------------+
– To use the bitwise solution you need a view of 2 to the power 25.
– the following solution is derived from http://stackoverflow.com/questions/9751318/creating-a-numbers-table-in-mysql
– the following solution ran in 43.8 seconds with the primary key, without it 4.56 seconds.
-- create a view that has 2 to the power 25 minus 1
-- 2 ^ 1
CREATE or replace VIEW `two_to_the_power_01_minus_1` AS select 0 AS `n` union all select 1 AS `1`;
-- 2 ^ 2
CREATE or replace VIEW `two_to_the_power_02_minus_1`
AS select
((`hi`.`n` << 1) | `lo`.`n`) AS `n`
from (`two_to_the_power_01_minus_1` `lo` join `two_to_the_power_01_minus_1` `hi`) ;
-- 2 ^ 4
CREATE or replace VIEW `two_to_the_power_04_minus_1`
AS select
((`hi`.`n` << 2 ) | `lo`.`n`) AS `n`
from (`two_to_the_power_02_minus_1` `lo` join `two_to_the_power_02_minus_1` `hi`) ;
-- 2 ^ 8
CREATE or replace VIEW `two_to_the_power_08_minus_1`
AS select
((`hi`.`n` << 4 ) | `lo`.`n`) AS `n`
from (`two_to_the_power_04_minus_1` `lo` join `two_to_the_power_04_minus_1` `hi`) ;
-- 2 ^ 12
CREATE or replace VIEW `two_to_the_power_12_minus_1`
AS select
((`hi`.`n` << 8 ) | `lo`.`n`) AS `n`
from (`two_to_the_power_08_minus_1` `lo` join `two_to_the_power_04_minus_1` `hi`) ;
-- 2 ^ 13
CREATE or replace VIEW `two_to_the_power_13_minus_1`
AS select
((`hi`.`n` << 1) | `lo`.`n`) AS `n`
from (`two_to_the_power_01_minus_1` `lo` join `two_to_the_power_12_minus_1` `hi`);
-- create a table to store the interim results for speed of retrieval
drop table if exists numbers_2_to_the_power_13_minus_1;
create table `numbers_2_to_the_power_13_minus_1` (
`i` int(11) unsigned
) ENGINE=myisam DEFAULT CHARSET=latin1 ;
-- faster 2 ^ 13
insert into numbers_2_to_the_power_13_minus_1( i )
select n from `two_to_the_power_13_minus_1` ;
-- faster 2 ^ 12
CREATE or replace view `numbers_2_to_the_power_12_minus_1`
AS select
`numbers_2_to_the_power_13_minus_1`.`i` AS `i`
from `numbers_2_to_the_power_13_minus_1`
where (`numbers_2_to_the_power_13_minus_1`.`i` < (1 << 12));
-- faster 2 ^ 25
CREATE or replace VIEW `numbers_2_to_the_power_25_minus_1`
AS select
((`hi`.`i` << 12) | `lo`.`i`) AS `i`
from (`numbers_2_to_the_power_12_minus_1` `lo` join `numbers_2_to_the_power_13_minus_1` `hi`);
-- create table for results
drop table if exists numbers ;
create table `numbers` (
`i` int(11) signed
, primary key(`i`)
) ENGINE=myisam DEFAULT CHARSET=latin1;
-- insert the numbers
insert into numbers(i)
select i from numbers_2_to_the_power_25_minus_1
where i <= 20000000 ;
drop view if exists numbers_2_to_the_power_25_minus_1 ;
drop view if exists numbers_2_to_the_power_12_minus_1 ;
drop table if exists numbers_2_to_the_power_13_minus_1 ;
drop view if exists two_to_the_power_13_minus_1 ;
drop view if exists two_to_the_power_12_minus_1 ;
drop view if exists two_to_the_power_08_minus_1 ;
drop view if exists two_to_the_power_04_minus_1 ;
drop view if exists two_to_the_power_02_minus_1 ;
drop view if exists two_to_the_power_01_minus_1 ;
问题内容: 这是我永远遇到的一个问题。 据我所知,索引的顺序很重要。因此,类似的索引与 并不相同,对吧? 如果我仅定义第一个索引,是否意味着它将仅用于 而不是 由于我使用的是ORM,所以我不知道这些列的调用顺序。这是否意味着我必须在所有排列上添加索引?如果我有2列索引,那是可行的,但是如果我的索引是3列或4列怎么办? 问题答案: 当查询条件仅适用于 部分 索引时,索引顺序很重要。考虑: 如果你的索
问题内容: 我有两张桌子。一个是在用户ID上带有主键的User表,另一个是使用外键引用该用户表的表。 “用户”表仅具有一个条目(目前),而另一个表则具有一百万个条目。 以下联接使我发疯: 在速度非常快的计算机上,查询耗时12秒,而排序的时间为0.0005秒,而没有排序的时间为0.0005秒。 我在user_id(IDX_14B78418A76ED395)上有一个索引,在user_id和upload
问题内容: 我有一些这样的数据: 我想查询它看起来像这样: …这样我就可以按数字连续的方式按GROUP BY分组。 另外,循环/游标也是不可能的,因为我正在处理大量数据,谢谢。 问题答案:
我们可以看到,转速不是单调增加的。在我的实体的审计表中,我有以下内容: 通过将记录与转速号链接在一起形成时间线,我得到了: 24 -- 事实上,我有一个由2台服务器组成的集群。它们都可以将数据持久化到数据库中。我怀疑这与版本号中的顺序问题有关。因为这个问题。像MyEntity anEntity=auditReader.find(MyEntity.class,id,revNum)这样的查询不起作用,
问题内容: 我们有一个带有表的数据库,该表的值是从另一个系统导入的。有一个自动增量列,没有重复的值,但缺少值。例如,运行以下查询: 应该返回100,但返回87。我可以运行任何查询来返回缺失数字的值吗?例如,可能存在ID为1-70和83-100的记录,但是没有ID为71-82的记录。我想返回71、72、73等 这可能吗? 问题答案: ConfexianMJS 在性能方面提供 了更好的 答案。 (不尽
我在一个返回一个巨大选择的过程中工作,我不想定义它是如何排序的。我不想从三个字段中选择一个,如果它是升序还是降序,如果三个选项都没有定义,它会默认返回降序中的第一个字段 这边 当然,这不起作用... mysql指责单词DESC和ASC中的错误,我怎么能让这个工作??