1

mysql には、約 100 万レコードの大きなテーブルがあります。

where句と順序で異なるパラメーターを持つ動的クエリを使用しているため、次のようなコードを使用できませんAND id > 34000 LIMIT 10

WHEREand LIMITandのフィールドにORDERインデックスがありますが、インデックスだけでは役に立ちません。

よりも良い方法が必要LIMIT 34000, 10です。オフセット遅延を緩和する方法はありますか?

テーブルスキーマを配置しましたが、動的クエリを使用しているため、インデックスなしでより使いやすいフィールドをコピーするだけです。

CREATE TABLE IF NOT EXISTS `p_apartmentbuy` (
  `property_id` mediumint(8) unsigned NOT NULL,
  `dateadd` int(10) unsigned NOT NULL,
  `sqm` smallint(5) unsigned NOT NULL,
  `sqmland` smallint(5) unsigned NOT NULL,
  `age` tinyint(2) unsigned NOT NULL,
  `price` bigint(12) unsigned NOT NULL,
  `pricemeter` int(11) unsigned NOT NULL,
  `floortotal` tinyint(3) unsigned NOT NULL,
  `floorno` tinyint(3) unsigned NOT NULL,
  `unittotal` smallint(4) unsigned NOT NULL,
  `unitthisfloor` tinyint(3) unsigned NOT NULL,
  `room` tinyint(1) unsigned NOT NULL,
  `parking` tinyint(1) unsigned NOT NULL,
  `renovate` tinyint(1) unsigned NOT NULL,
  `address` varchar(255) COLLATE utf8_general_ci NOT NULL,
  `describe` varchar(500) COLLATE utf8_general_ci NOT NULL,
  `featured` tinyint(1) unsigned NOT NULL,
  `l_location_id` smallint(5) unsigned NOT NULL,
  `l_city_id` smallint(4) unsigned NOT NULL,
  `pf_furnished_id` tinyint(2) unsigned NOT NULL,
  PRIMARY KEY (`property_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
4

2 に答える 2

2

1 ミルのレコードを持つテーブルの問題は 、構造とクエリの残りの部分まで発生するわけではありAND id > 34000 LIMIT 10ません。LIMIT 34000, 10IE、クエリを高速化するには、インデックス、PK、FK が必要です。さらに、Order by を使用すると速度が低下する可能性があります。検索を行うと、クエリが遅くなりlike '%text%'ます。また、それはテーブルのエンジン次第です

したがって、制限 10 を変更しても大きな違いが生じるとは思わないでください。「より良い」クエリを決定するのに役立つツールがいくつかありますが、すべてのクエリが同じように機能するわけではないため、「最適なソリューション」は存在しないため期待しないでください。

Showcreate tableまたはDescribe select ......またはexplainを使用して何が起こっているかを確認したり、 コマンドbenchmarkを使用して、改善のために適用している機能のおおよその時間を確認したりできます。

編集:

MySQL 用のいくつかのツール パフォーマンスのこの部分を支援するこのプログラムを参照することをお勧めします。

  • Mysqlslap (ベンチマークに似ていますが、結果をさらにカスタマイズできます)。
  • SysBench (テスト CPU パフォーマンス、I/O パフォーマンス、mutex 競合、メモリ速度、データベース パフォーマンス)。
  • Mysqltuner (これを使用すると、一般的な統計、ストレージ エンジンの統計、パフォーマンス メトリックを分析できます)。
  • mk-query-profiler (SQL ステートメントの分析を実行します)。
  • mysqldumpslow (ウィッチ クエリが問題を引き起こしていることを知っておくとよいでしょう)。
于 2012-07-05T17:01:15.920 に答える
1

インデックスのみを使用してクエリに一致する行を検索できる場合、MySQL は LIMIT 句を最適化できます (つまり、LIMIT で指定された範囲内の行のみをスキャン/評価します)。

のようなクエリの場合SELECT * FROM users WHERE active = 1 ORDER BY created_at、(active, created_at) に追加してインデックスを付けるだけで十分です。

http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/を参照してください。

于 2012-07-05T16:58:04.623 に答える