0

サーバー側からデータを取得するデータテーブルがあり、インデックスを追加してテーブルを最適化し、ソートを高速化したいと考えています (現在、60K 行をソートするのに約 7 秒かかります)。

私の 'copy create statement to clipboard' は次のようになります。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` char(128) COLLATE utf8_unicode_ci NOT NULL,
  `salt` char(5) COLLATE utf8_unicode_ci NOT NULL,
  `joined` int(10) unsigned NOT NULL,
  `name` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
  `surname` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
  `role` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `photo` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `user_type` int(11) DEFAULT NULL,
  `user_owner` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=81634 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

私が抱えている問題は、これを使用する場合:

ALTER TABLE `users` ADD INDEX (`email`, `name`, `surname`, `user_type`) ;

電子メールのみがインデックス化されます (少なくとも電子メールの列のみを高速に並べ替えることができます)。他のインデックス付きの列を追加するために何ができるかわかりません (または、実際に最適化するのに適しているかどうか)。

4

1 に答える 1

1

使用する列ごとに個別のインデックスを追加する必要があります。

ただし、注意してください。MySQL は、where 句または order by にのみインデックスを使用できます。しかし、一度に両方ではありません。場合を除き、両方で同じインデックスです。ただし、その場合、where 句は定数でなければなりません (つまり、単一の値に一致する必要があります)。

参照: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

于 2012-08-24T01:40:59.927 に答える