0

、、 として定義された 2 つのbigint列を含むテーブルがあります。はです。beginNumberendNumberUNIQUEIDPrimary Key

ID | beginNumber | endNumber | Name | Criteria

2 番目のテーブルには数値が含まれています。table2 の数値が任意の 2 つの数値の間にあることがわかったときに、table1 からレコードを取得したいと考えています。クエリは次のとおりです。

select distinct t1.Name, t1.Country
from t1
where t2.Number
BETWEEN t1.beginIpNum AND t1.endNumber

非常に多くのレコードがあるため、クエリに時間がかかりすぎています。DBの経験はありません。しかし、テーブルにインデックスを付けると検索が改善されるため、MySQL は m Number について検索するすべての行を通過する必要がなく、たとえばUNIQE値を持つことでこれを行うことができると読みました。table1のbeginNumber&endNumberを UNIQUE にしました。私にできることはこれだけですか?時間を改善する方法はありますか?詳細な回答を提供してください。

編集:

表1:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `beginNumber` bigint(20) DEFAULT NULL,
  `endNumber` bigint(20) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Criteria` varchar(455) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `beginNumber_UNIQUE` (`beginNumber`),
  UNIQUE KEY `endNumber_UNIQUE` (`endNumber `)
) ENGINE=InnoDB AUTO_INCREMENT=327 DEFAULT CHARSET=utf8

表 2:

CREATE TABLE `t2` (
  `id2` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) DEFAULT NULL,
  `Number` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id2`),
  UNIQUE KEY ` description _UNIQUE` (`description `)
) ENGINE=InnoDB AUTO_INCREMENT=433 DEFAULT CHARSET=utf8

これはテーブルのおもちゃの例ですが、関係する部分を示しています。

4

2 に答える 2

0

t2.Number次のようなインデックスを提案します。

ALTER TABLE t2 ADD INDEX numindex(Number);

使用する t2 がわからないため、クエリは記述どおりには機能しません。これを試して:

SELECT DISTINCT t1.Name, t1.Criteria
FROM t1 
WHERE EXISTS (SELECT * FROM t2 WHERE t2.Number BETWEEN t1.beginNumber AND t1.endNumber);

t2.Number インデックスがない場合、 EXPLAIN は次のクエリ プランを提供します。

1   PRIMARY t1  ALL                 1   Using where; Using temporary
2   DEPENDENT SUBQUERY  t2  ALL                 1   Using where

t2.Number のインデックスを使用すると、次の計画が得られます。

PRIMARY t1  ALL                 1   Using where; Using temporary
DEPENDENT SUBQUERY  t2  index   numindex    numindex    9       1   Using where; Using index

理解しておくべき重要な部分は、ALL比較は比較よりも遅いということindexです。

于 2012-12-20T17:13:26.960 に答える
-1

これは、バイナリ ツリー インデックスを使用するのに適した場所です (デフォルトはハッシュマップです)。Btree インデックスは、列間で頻繁に並べ替えまたは使用する場合に最適です。

CREATE INDEX index_name

ON table_name (列名)

Bツリーの使用

于 2012-12-20T17:05:32.487 に答える