MYSQL: Sequential Number Table

前端 未结 8 1820
清歌不尽
清歌不尽 2020-12-15 14:33

I am trying to get a sequential number table from 1 to 20 million. (or 0 to 20 million)

I am rather awestruck at how difficult it\'s been to get a MySQL-compatible s

8条回答
  •  粉色の甜心
    2020-12-15 15:15

    -- 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 ;
    

提交回复
热议问题