我有条语句select count(UserId) from User where UserId in (2,3,4,20,5,7,8) ;
我用explain解释后发现查询type为index,后来仔细查看后发现问题出在in (2,3,4,20,5,7,8),in后面只能带5个参数,如果大于5个那么查询速度就会降低,请问有什么办法解决吗??怎么样才能让查询类型升到range级别啊??UserId是主键
我用explain解释后发现查询type为index,后来仔细查看后发现问题出在in (2,3,4,20,5,7,8),in后面只能带5个参数,如果大于5个那么查询速度就会降低,请问有什么办法解决吗??怎么样才能让查询类型升到range级别啊??UserId是主键
用表保存2,3,4,20,5,7,8,比如ID,在此字段上建立索引,与工作表连接
ID
2
3
4
20
5
7
8在ID字段上建立索引
select * from tt a inner join lsb b on a.UserId=b.id
union all
select count(UserId) from User where UserId =2
......这样每条命令都是range了。
SELECT COUNT(UserId) INTO @RowCount FROM User where UserId in (2,3,4,20,5,7,8);
我需要 @RowCount 这个值来统计返回的条数,做分页的。。
与
SELECT COUNT(UserId) INTO @RowCount FROM User where UserId in (2,3,4,20,5,7,8);
等价
你写的是多表连接啊 ?? 和我的完全不是一个意思。。你告诉我的根本没用啊 怎么用 自连接啊??那返回的是全记录好不好,我不要返回全记录啊
把2,3,4,20等当做一个个单独的等于查询,最后去再把值相加,得到总数。
select count(*) from tt a inner join lsb b on a.UserId=b.id
是
SELECT COUNT(UserId) INTO @RowCount FROM User where UserId in (2,3,4,20,5,7,8);
语句的另外一种 写法,只返回一个总数,可以将COUNT(*)->COUNT(UserId)
这个where其实是一个参数 是前台传入的值。。所以我根本不知道要传多少个进来 是不固定的,但是现在超过5个就肯定有问题。。没办法改。。
至于wwwwa实在不好意思。。我没明白你的意思,select count(*) from tt a inner join lsb b on a.UserId=b.id
lsb 是什么啊??
他的方法我不是没有想过,不过每次都创建 效率是不高,查询到还可以改成这样就行了
select * from User a join UserFriend b on a.UserId = b.UserId where b.UserId > 0;
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$CREATE DEFINER=`root`@`` PROCEDURE `User_GetPaged`(
_WhereClause VARCHAR(250),
_OrderBy VARCHAR(250),
_PageIndex INT,
_PageSize INT,
OUT _TotalCount INT
)
BEGIN
SET @RowCount = 0;
SET @SqlStr = 'SELECT COUNT(UserId) INTO @RowCount FROM User';
IF _WhereClause IS NOT NULL AND _WhereClause <> '' THEN
SET @SqlStr = CONCAT(@SqlStr, ' WHERE ', _WhereClause);
END IF;
PREPARE StmtTotalCount FROM @SqlStr;
EXECUTE StmtTotalCount;
DEALLOCATE PREPARE StmtTotalCount;
SET _TotalCount = @RowCount;
SET @SqlStr = 'SELECT UserId, Email, UserFirstName, UserLastName, Password, UserStatusId, CreateDate FROM User';
IF _WhereClause IS NOT NULL AND _WhereClause <> '' THEN
SET @SqlStr = CONCAT(@SqlStr, ' WHERE ', _WhereClause);
ELSE
SET @SqlStr = CONCAT(@SqlStr, ' WHERE UserId > 0 ');
END IF;
IF _OrderBy IS NOT NULL AND _OrderBy <> '' THEN
SET @SqlStr = CONCAT(@SqlStr, ' ORDER BY ', _OrderBy);
END IF;
IF _PageIndex > 0 AND _PageSize > 0 THEN
SET @LimitStart = (_PageIndex - 1) * _PageSize;
SET @LimitEnd = _PageSize;
SET @SqlStr = CONCAT(@SqlStr, ' LIMIT ', @LimitStart, ',', @LimitEnd);
END IF;
PREPARE StmtRecord FROM @SqlStr;
EXECUTE StmtRecord;
DEALLOCATE PREPARE StmtRecord;END$$
我的储存过程是这样的
再
select FOUND_ROWS();这样。