1

次のクエリは、注文時に完了するまでに10秒かかります。注文なしで0.0005秒で終了します。フィールド「sku」、「vid」、「timestamp」にすでにインデックスがあります。このテーブルにはさらに200,000件のレコードがあります。orderbyを使用するときのクエリの何が問題になっていますか。

SELECT i.pn,i.sku,i.title, fl.f_inserted,fl.f_special, fl.f_notinserted
FROM inventory i 
LEFT JOIN inventory_flags fl ON fl.sku = i.sku AND fl.vid = i.vid
WHERE i.qty >=2 ORDER BY i.timestamp  LIMIT 0,100;

-- --------------------------------------------------------

--
-- Table structure for table `inventory`
--

CREATE TABLE IF NOT EXISTS `inventory` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pn` varchar(60) DEFAULT NULL,
  `sku` varchar(60) DEFAULT NULL,
  `title` varchar(60) DEFAULT NULL,
  `qty` int(11) DEFAULT NULL,
  `vid` int(11) DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `vid` (`vid`),
  KEY `sku` (`sku`),
  KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Table structure for table `inventory_flags`
--

CREATE TABLE IF NOT EXISTS `inventory_flags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `f_inserted` tinyint(1) DEFAULT NULL,
  `f_notinserted` tinyint(1) DEFAULT NULL,
  `f_special` tinyint(1) DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `sku` varchar(60) DEFAULT NULL,
  `vid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `vid` (`vid`),
  KEY `sku` (`sku`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

結果の説明:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  fl  system  vid,sku NULL    NULL    NULL    0   const row not found
1   SIMPLE  i   index   NULL    timestamp   5   NULL    10  Using where
4

3 に答える 3

4

結合条件で同じテーブルの複数の列を使用しているため、列に個別のインデックスを追加する代わりに、テーブルに複数列のインデックスを配置する必要があります

句から列を含めた後、複合インデックスの句でWHERE使用される列も含めます。フロー インデックスを追加してみて、EXPLAINを使用してテストします。ORDER BY

ALTER TABLE ADD INDEX ix_if inventory_flags(sku, vid);
ALTER TABLE ADD INDEX ix_i inventory(sku, qty, timestamp);

また、クエリで節を避けるようDISTINCTにしてください。これは節と同等GROUP BYです。それでも必要な場合は、カバリング インデックスを追加することを検討してください。

于 2012-08-21T10:17:11.413 に答える
2

skuが各インベントリ項目に固有である場合は、次のように定義しUNIQUEます - 処理速度が向上します。(または、との組み合わせsku-vidその場合は複合インデックスを定義します。)

なぜあなたはやっているのSELECT DISTINCTですか?使用している時間の大部分は、DISTINCTクエリまたはテーブル構造が間違っていることを示しています。

DISTINCTあり、タイムスタンプのインデックスを使用して高速化することはできないため、200,000 レコードのテーブルをソートする必要があります。qty のインデックスを使用してその部分を高速化することさえできませんskuUNIQUE

PS。Omesh にも良いアドバイスがあります。

于 2012-08-21T10:17:59.703 に答える