2

次のような SQL クエリがあります。

SELECT  DISTINCT `User`.*
FROM    `user` AS `Users`
WHERE   `Users`.`group_id` IN (1,2,3,4,5,6,7,8,9,10........)

私の問題は、IN条件が非常に長くなる可能性があることです。この問題なしでこれを行うための代替方法について誰かがアイデアを持っているかどうか尋ねますか? 私の SHOW CREATE TABLE ユーザーは

CREATE TABLE users (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  username char(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  password char(40) COLLATE utf8_unicode_ci DEFAULT NULL,
  first_name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  last_name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  email varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  group_id int(10) unsigned NOT NULL,
  PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=45
  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

どうもありがとう

4

2 に答える 2

1

を介してクエリ間で値を渡す代わりにPHP、MySQL 自体で ( を使用してJOIN)実行します。

SELECT  DISTINCT `Users`.*
FROM    (
        SELECT  id
        FROM    your_query
        ) q
JOIN    `user` AS `Users`
ON      `Users`.group_id = q.id

にインデックスを作成するuser.group_id

于 2012-05-18T15:06:52.813 に答える
0

このようなタスク用の処理テーブルを作成しました。これを切り捨てて、後続のクエリで使用する必要があるデータを入力します。これは主に、レポートのためにあるテーブル セットから別のテーブル セットにデータを移動する非リアルタイムの状況で行われました。

基本的に私は次のようなことをします:

# clear out the staging table (or maybe create a temporary table if that makes sense for you)
truncate staging_table

# go fetch all the group_id's needed into this staging table
INSERT INTO staging_table table
SELECT  distinct group_id
FROM ... 

# Now get all the users like so:
SELECT  DISTINCT `User`.*
FROM    `user` AS `Users` 
  JOIN staging_table on `Users`.`group_id` = staging_table.group_id;

基本的に必要なすべての group_id がテーブルにあるため、IN LIST はなくなりました

これを 1 つではなく 2 つのクエリに分割しているため、これは遅くなる可能性があります。ただし、私の場合、「リスト内」の一部は文字通り数万の長さであり、MySQL (少なくとも当時) はそれらを詰まらせていました。

いくつかのメモ:

  • これが複数のユーザーが同時にこれを行う可能性がある場合は、おそらく TEMPORARY TABLES を使用してユーザーを分離する必要があります。

  • 複数の列を作業テーブルに追加したときに、作業テーブルにインデックスを追加することでうまくいく場合がありました。

于 2012-05-18T15:21:05.457 に答える