我有以下三個WHERE
條款:我應該在哪裏放置指標的MySQL表
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)'。請參閱:http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain – Johan