【发布时间】:2015-03-29 11:32:51
【问题描述】:
我有这张桌子:
业务表:
bussId | nameEn | nameHe | nameAr | status | favor | cityId | categoryId
分类表:
categoryId | keywords
最喜欢的表:
userId | bussId
评分表:
userId | bussId | rating
我正在运行此查询,它使用 cityId 过滤企业并搜索(business.nameEn、business.nameAr、business.nameHe、categories.keywords),然后按青睐、状态和 nameEn 排序。
SELECT DISTINCT bussID ,businessName, bussStatus,favor, ratingCount , ratingSum
FROM
(
SELECT DISTINCT business.bussID , business.nameEn as businessName , bussStatus,favor,
(SELECT COUNT(rating.bussId) FROM `rating` WHERE rating.bussId = business.bussID) as ratingCount ,
(SELECT SUM(rating.rating) FROM `rating` WHERE rating.bussId = business.bussID) as ratingSum
FROM business LEFT JOIN favourites ON (favourites.bussID = business.bussID AND favourites.userID = '30000')
INNER JOIN `categories` ON (`categories`.`categoryId` = `business`.`subCategoryId` )
WHERE (bussiness.cityID = 11)
AND (
( REPLACE( REPLACE(REPLACE(LOWER(`bussiness`.`nameEn`),'أ','ا'),'أ','ا') ,'ة','ه') LIKE '%test%' )
OR( REPLACE( REPLACE(REPLACE(LOWER(`bussiness`.`nameHe`),'أ','ا'),'أ','ا') ,'ة','ه') LIKE '%test%' )
OR( REPLACE( REPLACE(REPLACE(LOWER(`bussiness`.`nameAr`),'أ','ا'),'أ','ا') ,'ة','ه') LIKE '%test%' )
OR( REPLACE( REPLACE(REPLACE(LOWER(`categories2`.`keyWords`),'أ','ا'),'أ','ا') ,'ة','ه') LIKE '%test%' )
)
AND
(bussiness.bussStatus IN(1,3,5,7)
)
GROUP BY bussiness.bussID )results
ORDER BY
businessName LIKE '%test%' DESC,
FIELD(bussStatus,'1','5','3'),
FIELD(favor,'1','2','3'),
businessName LIMIT 0,10
我正在使用替换来搜索不区分大小写的 أ ا 和 ة ه 字母(在添加测试词之前,我也替换了这些字母)。
我的问题:
- 我想知道如何正确声明索引!
我应该声明多列索引吗:
ALTER TABLE `bussiness`
ADD INDEX `index9` (`nameHe` ASC, `nameEn` ASC, `nameAr` ASC, `favor` ASC, `bussStatus` ASC);
或每个列的一个列索引!
- 我应该创建另一个包含
nameAr,nameEn,nameHe的列allNamesLanguages然后我只搜索这个列吗?
【问题讨论】:
-
并不是说“业务”是这样拼写的。至于索引,为什么不吸进去看看呢?
-
@Strawberry 我怎么知道我的查询使用了哪些索引!
-
EXPLAIN 会告诉你(我的意思是'note',而不是'not')
标签: mysql sql database indexing