以下のクエリを実行して、テーブルから毎日のユーザーサインインの詳細を取得しています。サンプルテーブルと実行中のクエリを投稿しました。
問題
私のクエリはrange
、テーブル全体を調べるクエリとして実行されていません。私にとっては遅くなります。ミリ秒単位のタイムスタンプ間に大きな違いがないため、タイムスタンプ列にインデックスを付けると役に立ちません。製品が実稼働環境にあるため、テーブルのタイムスタンプ列にインデックスを付けることができませんでした。何百万もの行が含まれます。このクエリをrange
1つまたはより良いソリューションとしてどのように実行できますか?
MYSQLテーブル +---------------+ ------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --+ | テーブル| テーブルの作成|
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SignInDetails | CREATE TABLE `SignInDetails` (
`USER_ID` bigint(20) DEFAULT NULL,
`UserName` char(200) DEFAULT NULL,
`TIMESTAMP` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
クエリ
select USER_ID,TIMESTAMP from SignInDetails where TIMESTAMP
between UNIX_TIMESTAMP(CURRENT_DATE()-INTERVAL 1 DAY)*1000 and
UNIX_TIMESTAMP(CURRENT_DATE())*1000
出力の説明
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | SignInDetails | ALL | NULL | NULL | NULL | NULL | 21 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
テーブル内の合計行
21