を持っていません最初と最後の結合で索引を使用できることが期待されます。あなたが見ることができるように、それはしません。私のMySQLのインデックスは、私は次のクエリを持っている任意の効果
最初は計算された日付とは関係がありますが、日付フィルタがなくてもインデックスは使用されません。私はインデックスのいくつかのバリエーションを試みたが、私ははるかに多くを取得していません。私はここで何が欠けていますか?
関連するテーブルのインデックスは次のとおりです。
ALTER TABLE exhibitions ADD INDEX(slug);
ALTER TABLE exhibitions ADD INDEX(venue_id, ends);
ALTER TABLE temperatures ADD INDEX(ref);
そして、要求され、展覧会だけでなく、テーブルのクエリを作成するなど:
CREATE TABLE `exhibitions` (
`id` char(36) NOT NULL,
`clue` char(6) NOT NULL DEFAULT '',
`venue_id` char(36) NOT NULL,
`name` varchar(255) NOT NULL,
`slug` varchar(255) NOT NULL,
`description` text,
`starts` date DEFAULT NULL,
`ends` date DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`user_id` char(36) NOT NULL,
`featured` tinyint(1) NOT NULL DEFAULT '0',
`permanent` tinyint(1) unsigned NOT NULL DEFAULT '0',
`active` tinyint(1) unsigned NOT NULL DEFAULT '1',
`cidn` varchar(255) DEFAULT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `slug` (`slug`),
KEY `cidn` (`cidn`),
KEY `venue_id` (`venue_id`,`ends`),
KEY `venue_id2` (`venue_id`),
FULLTEXT KEY `name` (`name`,`description`,`url`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
を追加しまし統計:結果を更新しました
mysql> SELECT *
-> FROM information_schema.statistics
-> WHERE UPPER(table_name) = UPPER('temperatures')
-> AND UPPER(column_name) = UPPER('ref');
+---------------+--------------+--------------+------------+--------------+------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | NON_UNIQUE | INDEX_SCHEMA | INDEX_NAME | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULLABLE | INDEX_TYPE | COMMENT |
+---------------+--------------+--------------+------------+--------------+------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+
| NULL | narb | temperatures | 0 | narb | unique_ref | 1 | ref | A | 2655 | NULL | NULL | | BTREE | |
| NULL | narb | temperatures | 1 | narb | ref | 1 | ref | A | 2655 | NULL | NULL | | BTREE | |
+---------------+--------------+--------------+------------+--------------+------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+
2 rows in set (0.02 sec)
クアズノーの誇り:
mysql> EXPLAIN
-> SELECT Exhibition.venue_id, Exhibition.name, Exhibition.slug,
-> Venue.name, Venue.slug, Venue.location_id,
-> Venue.id, Exhibition.id
-> FROM exhibitions AS Exhibition
-> LEFT JOIN
-> venues AS Venue
-> ON Venue.id = Exhibition.venue_id
-> LEFT JOIN
-> temperatures AS Temperature FORCE INDEX (unique_ref)
-> ON Temperature.ref = Exhibition.id
-> WHERE Exhibition.active = '1'
-> AND Exhibition.ends <= CURDATE()
-> ORDER BY
-> Temperature.temperature DESC
-> LIMIT 5;
+----+-------------+-------------+--------+---------------+---------+---------+--------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+--------+---------------+---------+---------+--------------------------+------+----------------------------------------------+
| 1 | SIMPLE | Exhibition | ALL | NULL | NULL | NULL | NULL | 1536 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | Venue | eq_ref | PRIMARY | PRIMARY | 108 | narb.Exhibition.venue_id | 1 | |
| 1 | SIMPLE | Temperature | ALL | NULL | NULL | NULL | NULL | 2662 | |
+----+-------------+-------------+--------+---------------+---------+---------+--------------------------+------+----------------------------------------------+
3 rows in set (0.00 sec)
は、追加の温度のテーブルを作成します。
CREATE TABLE `temperatures` (
`id` int(10) unsigned NOT NULL auto_increment,
`ref` char(36) NOT NULL,
`views` int(10) unsigned NOT NULL,
`ratings` int(10) unsigned NOT NULL,
`comments` int(10) unsigned NOT NULL,
`bookmarks` int(10) unsigned NOT NULL,
`tags` int(10) unsigned NOT NULL,
`collected` int(10) unsigned NOT NULL default '0',
`trips` int(10) unsigned NOT NULL,
`fans` int(10) unsigned NOT NULL,
`temperature` int(10) NOT NULL default '1000',
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_ref` (`ref`),
KEY `ref` (`ref`)
) ENGINE=MyISAM AUTO_INCREMENT=2743 DEFAULT CHARSET=latin1;
完了!申し訳ありませんが少し時間がかかりましたが、その間NL – tijs
に強制インデックスが追加されていましたが、どちらの効果もないようです... – tijs
はテーブル作成クエリを追加しました... – tijs