3k レコードを格納するテーブルが 1 つあります。
私はEntity FrameworkとORMを初めて使用しますが、何かがうまくいかないことは理解できます。
このlinqクエリを実行すると:
repo.GetQuery<Article>().Where(foo=>foo.Expires_date>=date
&& foo.Istoparticle==true
&& foo.Isfrontpage==false)
.OrderByDescending(foo=>foo.Date)
.Take(4);
私はmysql側でこのクエリを取得します:
選択する `Project1`.`ID`, `Project1`.`User_id`, `Project1`.`Category_id`, `Project1`.`タイトル`, `Project1`.`値`, `Project1`.`キーワード`, `Project1`.`説明`, `Project1`.`画像`, `Project1`.`投票`, `Project1`.`Views`, `Project1`.`Isvisible`, `Project1`.`Isfrontpage`, `Project1`.`Istoparticle`, `Project1`.`日付`, `Project1`.`Expires_date`, `Project1`.`Votes_sum` から (選択 `Extent1`.`Id`, `Extent1`.`User_id`, `Extent1`.`Category_id`, `Extent1`.`タイトル`, `Extent1`.`Value`, `Extent1`.`キーワード`, `Extent1`.`説明`, `Extent1`.`画像`, `Extent1`.`投票`, `Extent1`.`Votes_sum`, `Extent1`.`Views`, `Extent1`.`Isvisible`, `Extent1`.`Isfrontpage`, `Extent1`.`Istoparticle`, `Extent1`.`Expires_date`, `Extent1`.`Date` FROM `tcms_articles` AS `Extent1` WHERE `Extent1`.`Expires_date` >= '2012-06-24 13:41:47.816') AS `Project1` オーダーバイ `Project1`.`Date` DESC LIMIT 4
このクエリの実行には約 3.50 秒かかります。
このクエリの説明:
+----+-------------+------------+-------+--------- ------+--------------+---------+------+------+---- ------------+ | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ | +----+-------------+------------+-------+--------- ------+--------------+---------+------+------+---- ------------+ | | 1 | プライマリ | | | すべて | ヌル | ヌル | ヌル | ヌル | 4054 | ファイルソートの使用 | | | 2 | 派生 | 範囲 1 | 範囲 | 有効期限 | 有効期限 | 8 | ヌル | 4053 | where | の使用 +----+-------------+------------+-------+--------- ------+--------------+---------+------+------+---- ------------+
私が照会するとき:
SELECT *
FROM tcms_articles
WHERE expires_date >= '2012-06-24 13:41:47.816'
ORDER BY date DESC
limit 4
私は0.01秒を取得します...
Explain を再度実行すると、次のようになります。
+----+-------------+---------------+-------+------ ------+------+---------+------+------+--------- --+ | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ | +----+-------------+---------------+-------+------ ------+------+---------+------+------+--------- --+ | | 1 | シンプル | tcms_記事 | インデックス | 有効期限 | 日付 | 8 | ヌル | 11 | where | の使用 +----+-------------+---------------+-------+------ ------+------+---------+------+------+--------- --+
なぜこれが起こっているのかわかりません。
エンティティ フレームワーク 4.3 MySQL コネクタ ネット 6.5.4.0
編集 :
tcms_articles :
CREATE TABLE `tcms_articles` ( `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, `User_id` int(10) unsigned DEFAULT NULL, `Category_id` int(10) unsigned DEFAULT NULL, `タイトル` varchar(255) DEFAULT NULL, `Value`ロングテキスト、 `Keywords` varchar(255) NOT NULL DEFAULT '', `Description` varchar(255) NOT NULL DEFAULT '', `Images` longtext NOT NULL, `Votes` int(10) unsigned NOT NULL DEFAULT '1', `Votes_sum` int(10) unsigned NOT NULL DEFAULT '5', `Views` int(10) unsigned NOT NULL DEFAULT '0', `Isvisible` tinyint(1) unsigned NOT NULL DEFAULT '1', `Isfrontpage` tinyint(1) unsigned NOT NULL DEFAULT '0', `Istoparticle` tinyint(1) unsigned NOT NULL DEFAULT '1', `Expires_date` datetime NOT NULL DEFAULT '2099-12-31 00:00:00', `Date` datetime NOT NULL, 主キー (`Id`)、 KEY `article_users` (`User_id`) BTREE を使用して、 KEY `article_section` (`Category_id`) BTREE を使用して、 KEY `Isvisible_index2` (`Isvisible`) USING BTREE, KEY `Istoparticle_index2` (`Istoparticle`) USING BTREE, KEY `Expires_date_index2` (`Expires_date`) USING BTREE, KEY `isfrontpage2` (`Isfrontpage`) USING BTREE, KEY `Date_index2` (`Date`) BTREE を使用して、 CONSTRAINT `tcms_articles_ibfk_1` FOREIGN KEY (`Category_id`) REFERENCES `tcms_categories` (`Id`) 削除カスケードの場合 更新カスケードの場合、 CONSTRAINT `tcms_articles_ibfk_2` FOREIGN KEY (`User_id`) REFERENCES `tcms_users` (`Id`) オン 削除 カスケード オン 更新 カスケード ) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
では、Linq がこのクエリを生成する理由と、これを修正するにはどうすればよいですか?