2

VarnishキャッシュサーバーからSQLサーバーでこのクエリを実行すると。

select count(distinct email) from aiki_users, ocal_files where userid = 
       (select upload_user from ocal_files where upload_user = userid limit 1)

aiki_users80000 行を超えるテーブルを使用

およびocal_files30000 行を超えるテーブル。

サーバーを殺します。ajax経由でphpスクリプトから呼び出されます。それを呼び出しているページを閉じる必要があります。

何を返すかはわかりませんが、やりたいことはgroup byとhavingで作成する必要があることは知っていますが、方法がわかりません。

aiki_users テーブルは次のようになります。

CREATE TABLE IF NOT EXISTS `aiki_users` (
  `userid` int(9) unsigned NOT NULL auto_increment,
  `username` varchar(100) NOT NULL default '',
  `full_name` varchar(255) NOT NULL,
  `country` varchar(255) NOT NULL,
  `sex` varchar(25) NOT NULL,
  `job` varchar(255) NOT NULL,
  `password` varchar(100) NOT NULL default '',
  `oauth_passcode` varchar(255) NOT NULL,
  `oauth_token` varchar(255) NOT NULL,
  `oauth_token_secret` varchar(255) NOT NULL,
  `usergroup` int(10) NOT NULL default '0',
  `email` varchar(100) NOT NULL default '',
  `avatar` varchar(255) NOT NULL,
  `homepage` varchar(100) NOT NULL default '',
  `first_ip` varchar(40) NOT NULL default '0',
  `first_login` datetime NOT NULL,
  `last_login` datetime NOT NULL,
  `last_ip` varchar(40) NOT NULL,
  `user_permissions` text NOT NULL,
  `maillist` int(1) NOT NULL,
  `logins_number` int(11) NOT NULL,
  `randkey` varchar(255) NOT NULL,
  `is_active` int(5) NOT NULL,
  PRIMARY KEY  (`userid`),
  KEY `username` (`username`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

サーバーへの正しいアクセス権がありません。ocal_files の定義が表示されませんが、次のようになります。

 ocal_files.aiki_users = aiki_users.userid

クエリがどれほど悪いのか、何を返すのか教えてもらえますか?

4

2 に答える 2

4

結合句を指定せずに、メイン クエリで aiki_user と ocal_files の両方から選択している場合、ネストされたクエリの where は完全なテーブル結合を停止しません...

于 2011-03-16T12:29:19.247 に答える
0

両方のクエリで EXPLAIN PLAN を実行し、データベースの内容を確認することをお勧めします。

私の推測では、TABLE SCAN を実行する必要があるため、パフォーマンスはひどいものです。

于 2011-03-16T12:30:16.283 に答える