1

次の (簡略化された) クエリがスローログ mysql ファイルに表示されます。これは、ページ分割された Web サイトからすべてのページをクロールする検索エンジン クローラーによるものです。

select * from listing 
where 
   active=1 
   and approved=1 
   and deleted=0 
   and enabled=1 
order by 
   full_listing desc,  
   picture_count*rating/rating_count desc, 
   rating desc 
limit 21230, 10;

わずか 60,000 レコードのテーブルを処理するのに 8 秒以上かかることに驚いています。

説明プランは次のようになります

1   SIMPLE  listing0_   index_merge listing_active,listing_approved,listing_enabled,listing_deleted,sort_index  listing_active,listing_approved,listing_enabled,listing_deleted 1,1,1,1     3102    Using intersect(listing_active,listing_approved,listing_enabled,listing_deleted); Using where; Using filesort

パフォーマンスを向上させるために、どのインデックスを作成できますか?

テーブル構造:

'CREATE TABLE `listing` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account_id` bigint(20) DEFAULT NULL,
  `domain_id` bigint(20) DEFAULT NULL,
  `active` bit(1) NOT NULL,
  `approved` bit(1) NOT NULL,
  `denied` bit(1) NOT NULL,
  `deleted` bit(1) NOT NULL,
  `enabled` bit(1) NOT NULL,
  `full_listing` bit(1) DEFAULT b''0'',
  `public_id` varchar(255) DEFAULT NULL,
  `name` varchar(100) NOT NULL,
  `rating` int(11) NOT NULL,
  `rating_count` int(11) NOT NULL,
  `rating_enabled` bit(1) NOT NULL,
  `picture_count` int(11) DEFAULT ''0'',
  `createdAt` datetime NOT NULL,
  `createdBy` varchar(15) NOT NULL,
  `updatedAt` datetime NOT NULL,
  `updatedBy` varchar(15) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `listing_public_id` (`public_id`),
  KEY `FKB4DC521D9306A80C` (`account_id`),
  KEY `FKB4DC522D7A66E1A8` (`domain_id`),
  KEY `listing_active` (`active`),
  KEY `listing_approved` (`approved`),
  KEY `listing_enabled` (`enabled`),
  KEY `listing_deleted` (`deleted`),
  KEY `listing_picture_count` (`picture_count`),
  KEY `listing_rating` (`rating`),
  KEY `listing_rating_count` (`rating_count`),
  KEY `listing_full_listing` (`full_listing`),
  CONSTRAINT `listing_ibfk_1` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`),
  CONSTRAINT `listing_ibfk_2` FOREIGN KEY (`domain_id`) REFERENCES `domain` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=59512 DEFAULT CHARSET=utf8'
4

1 に答える 1

1

Using filesort 原因になる可能性があります。インデックスは何ですか? 個人的には、列のステータスにintが含まれているなど、あなたがしていることにビットシフトを使用します

右側のビットをこのように

0000 アクティブ | 承認済み | 削除されました | 有効

あなたの例では、where status = 1011 またはstatus = 11(ビットがintに変換される場合)

次に、すべての組み合わせで1つのインデックスしかありません(0と1を使用すると、mysqlがインデックスを無視する場合があります)

于 2013-01-07T11:35:17.880 に答える