【发布时间】:2011-11-23 04:12:39
【问题描述】:
我有以下 2 个mysql_queries:
查询 1(此查询针对 imgClass 和 imgGender 再重复两次):
$imgFamily_query = "SELECT DISTINCT imgFamily FROM primary_images WHERE '$clause' ";
查询 2:
$query_pag_data = "SELECT imgId, imgURL, imgTitle, view, secondary FROM primary_images WHERE '$clause' ORDER BY imgDate DESC";
如您所见,WHERE 由变量控制。该变量的计算方式如下:
$where_clauses = array();
if ($imgFamilyFalse && $imgClassFalse && $imgGenderFalse) {
$where_clauses[] = "1=1"; // default do-nothing clause
}
if ($imgFamilyTrue) {
$where_clauses[] = 'imgFamily=' . "'" . mysql_real_escape_string($_GET['imgFamily']) . "'";
}
if ($imgClassTrue) {
$where_clauses[] = 'imgClass=' . "'" . mysql_real_escape_string($_GET['imgClass']) . "'";
}
if ($imgGenderTrue) {
$where_clauses[] = 'imgGender=' . "'" . mysql_real_escape_string($_GET['imgGender']) . "'";
}
$clause = implode(' AND ', $where_clauses);
WHERE 子句仅依赖于以下 3 列:
imgFamilyimgClassimgGender
但是,根据情况,可以使用这些列中的任意 1、2 或 3 列的组合。
我的问题是,在这种情况下我应该如何为primary_images 设置索引?这是一个“只读”表,所以我不担心索引太多。我希望该表在查询中尽可能高效。
我正在考虑使用多列索引,但由于多列索引中的第一列可能不存在,因此索引不起作用。
是否可以设置多个多列索引?还是在这种情况下只在有问题的 3 列中的每一列上放置一个索引会更好?
【问题讨论】:
-
别忘了在
1=1列上添加索引。 -
@Johan - 我应该在你写它的时候问你这个问题,但是我该如何在
1=1列上放置一个索引呢?一直在想,想不通。 -
我在开玩笑,这显然是不可能的:-)
-
而关于性别的索引由于其基数低而无用。所以你应该有 3 个索引: A: 仅在 imgdate 上。 B:关于 imgClass,imgDate C:关于 IngFamily,Imgdate。如果 MySQL 拒绝使用索引,那将是因为跳过索引更快。这通常是因为索引的基数较低。
-
唯一索引将阻止您在该索引所涵盖的字段中插入具有相同数据的 2 个项目。如果那是你想要的,你应该这样做。唯一索引不会使您的选择更快。它只会减慢您的插入(和更新)速度,因为它必须检查唯一性要求。
标签: mysql database database-design indexing