2

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 がこのクエリを生成する理由と、これを修正するにはどうすればよいですか?

4

1 に答える 1