0

現在、DB へのクエリが遅いという問題があります。クエリ時間は 0.0005 秒から 70 秒までさまざまです。

現在、コンテンツを含む私のテーブル構造は次のとおりです。

CREATE TABLE IF NOT EXISTS `content` (
  `content_id` int(11) NOT NULL AUTO_INCREMENT,
  `content_url` テキスト NOT NULL,
  `content_text` テキスト NOT NULL,
  `seed_id` int(11) NOT NULL,
  `created_at` bigint(20) NOT NULL,
  `image` varchar(2000) DEFAULT NULL,
  `price` varchar(300) DEFAULT NULL,
  主キー (`content_id`)、
  UNIQUE KEY `CONTENT_TEXT_UNIQUE` (`content_text`(255)),
  KEY `FK_SEED_CODE` (`seed_id`),
  KEY `CONTENT_TEXT_TIME_INDEX` (`content_text`(255),`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=111357870 ;


ALTER TABLE `コンテンツ`
  ADD CONSTRAINT `FK_SEED_ID` FOREIGN KEY (`seed_id`) REFERENCES `seed` (`seed_id`) ON DELETE CASCADE ON UPDATE CASCADE;

現在、データベースへのクエリは 2 つしかありません。

コンテンツから id、content.content_url、content.content_text、content.created_at、content.image、content.price として、seed.seed_code、content.content_id を選択します。
        LEFT JOIN シード ON content.seed_id = seed.seed_id
        WHERE seed.seed_switch = 1 AND seed.seed_status_id = 3 AND seed.seed_id in (
        SELECT seed_id FROM シード WHERE storage_id ='.$storage.') '.$filter.' ORDER BY content.content_id DESC、content.created_at DESC LIMIT 50

コンテンツから id、content.content_url、content.content_text、content.created_at、content.image、content.price として、seed.seed_code、content.content_id を選択します。
        LEFT JOIN シード ON content.seed_id = seed.seed_id
        WHERE seed.seed_switch = 1 AND seed.seed_status_id = 3 AND seed.seed_id in (
        SELECT seed_id FROM シード WHERE storage_id ='.$storage.') ORDER BY content.content_id DESC, content.created_at DESC LIMIT 50

テーブル シードには ± 20 エントリが含まれます。ほとんど変わらないもの。

コンテンツ テーブルに作成されたインデックスが機能していないようです。まだロード時間が非常に長いためです。

DBの改善点は何ですか?

更新 1

コンテンツ テーブルには約 100 万のエントリが含まれており、毎日 1 ~ 2,000 のエントリで増加しています。

$filter 変数には、追加のフィルターが含まれています。したがって、ユーザー入力に応じてランダムに生成される他のいくつかの AND ステートメント。ただし、content.text と created_at の日付のみをフィルタリングします。


4

1 に答える 1

2

編集 わかりました、作成テーブルの自動インクリメントに気付きました。何百万ものレコードを持っているか持っていて (インクリメントが 1 億を超えているため)、where-in サブセレクトを実行していますが、そのアプローチでは理想的なパフォーマンスが得られません。以下のクエリを試して、読み込み時間が改善されるかどうかを確認してください。

すべての詳細を提供したわけではありません (たとえば、問題のテーブルに含まれるレコードの数や出力内容など'.$filter.')。また、タイピングの手間を省き、テーブルにエイリアスを設定してください。クリーンアップされた例:

SELECT s.seed_code, c.content_id as id, c.content_url, c.content_text, c.created_at, c.image, c.price 
FROM content c
JOIN seed s USING(seed_id)
WHERE s.seed_switch = 1 
  AND s.seed_status_id = 3 
  AND s.storage_id ='.$storage.'
  '.$filter.' 
ORDER BY c.content_id DESC
LIMIT 50
于 2012-04-25T07:51:03.047 に答える