【发布时间】:2011-09-21 21:12:14
【问题描述】:
我有以下三个WHERE 子句:
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight
WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight"
他们正在对两个 MySQL InnoDB 表进行操作,该表使用UNION ALL 加入查询。
我不确定我应该如何在这两个表中设置索引;我是否应该有一个多列索引,包含imgWidth 和imgHeight,还是应该包含primaryId?
查询只能使用一个索引是真的吗?如果没有,我可以将每一列设置为索引吗?
或者在这种情况下多列索引不起作用?
这是第一个WHERE 子句的整个查询示例。其他同理,各有分句:
SELECT 'allEqual' AS COL1,COUNT(*) AS imgCount FROM (
SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
UNION ALL
SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight
这是primary_images 表的架构:
CREATE TABLE IF NOT EXISTS `new_arrivals_images`.`primary_images` (
`imgId` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT ,
`imgTitle` VARCHAR(255) NULL DEFAULT NULL ,
`view` VARCHAR(45) NULL DEFAULT NULL ,
`secondary` ENUM('true','false') NOT NULL DEFAULT false ,
`imgURL` VARCHAR(255) NULL DEFAULT NULL ,
`imgWidth` SMALLINT(6) UNSIGNED NULL DEFAULT NULL ,
`imgHeight` SMALLINT(6) UNSIGNED NULL DEFAULT NULL ,
`imgDate` DATETIME NULL DEFAULT NULL ,
`imgClass` ENUM('Jeans','T-Shirts','Shoes','Dress Shirts','Trackwear & Sweatwear') NULL DEFAULT NULL ,
`imgFamily` ENUM('Hugo Boss','Lacoste','True Religion','7 For All Mankind','Robin\'s Jeans','Robert Graham') NULL DEFAULT NULL ,
`imgGender` ENUM('Men\'s','Women\'s') NOT NULL DEFAULT Mens ,
PRIMARY KEY (`imgId`) ,
UNIQUE INDEX `imgDate_UNIQUE` (`imgDate` DESC) )
ENGINE = InnoDB;
secondary_images 表的架构:
CREATE TABLE IF NOT EXISTS `new_arrivals_images`.`secondary_images` (
`imgId` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT ,
`primaryId` SMALLINT(6) UNSIGNED NOT NULL ,
`view` VARCHAR(45) NULL DEFAULT NULL ,
`imgURL` VARCHAR(255) NULL DEFAULT NULL ,
`imgWidth` SMALLINT(6) UNSIGNED NULL DEFAULT NULL ,
`imgHeight` SMALLINT(6) UNSIGNED NULL DEFAULT NULL ,
`imgDate` DATETIME NULL DEFAULT NULL ,
PRIMARY KEY (`imgId`, `primaryId`) ,
INDEX `fk_secondary_images_primary_images` (`primaryId` ASC) ,
UNIQUE INDEX `imgDate_UNIQUE` (`imgDate` DESC) ,
CONSTRAINT `fk_secondary_images_primary_images`
FOREIGN KEY (`primaryId` )
REFERENCES `new_arrivals_images`.`primary_images` (`imgId` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
【问题讨论】:
-
您的代码是一个 SQL 注入漏洞。请将您的所有
$vars括在单引号中:where field1 = '$var' ...并且不要忘记在将它们注入查询之前使用$var = mysql_real_escape_string($var)。见:stackoverflow.com/questions/332365/…
标签: mysql database database-design indexing