質問: tmp_tbl.id; ``` ### 対象テーブル * データ数300万件(随時増えています) * `user_id`は値が飛び飛び(700,000,000~999,999,999でランダム) * `name`はユーザー名 * `del_flg`は0が削除されていない。1が削除済み。 * `creation_time`は`accounts`テーブルにデータが挿入された日時 ``` CREATE TABLE `accounts` ( `user_id` INT(11) NOT NULL, `name` VARCHAR(36) NOT NULL, `del_flg` TINYINT(1) NOT NULL DEFAULT '0', `creation_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`user_id`), INDEX `name` (`name`), INDEX `del_flg` (`del_flg`), INDEX `creation_time` (`creation_time`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB; ``` ### DBサーバ * CentOS 7.2.1511 * MariaDB Version 15.1
回答: 「その3」を改変して、 ``` SELECT CEIL((SELECT MIN(`user_id`)) + RAND() * (SELECT MAX(`user_id`) - MINB(`user_id`) FROM `accounts`)) ``` のようにしてみてはどうでしょうか(値のつまり具合で、均等にならないことは間違いないですが、MIN以下を拾うというのは避けられます)。