我有一个表Order
对Order表建了两个索引ParentID,UserID
现在Order表有1千万条数据,
用Select * from ParentID=100只用了5s可以把数据查出来
用Select * from UserID=145 只用了4s可以数据查出来
但用Select * from ParentID=100 and UserID=145查,结果要了我5分钟
现在真是急啊,大位高手能帮我解释这是为什么???
...全文
1468打赏收藏
SQL查找为什么这么变态
我有一个表Order 对Order表建了两个索引ParentID,UserID 现在Order表有1千万条数据, 用Select * from ParentID=100只用了5s可以把数据查出来 用Select * from UserID=145 只用了4s可以数据查出来 但用Select * from ParentID=100 and UserID=145查,结果要了我5分钟 现在真是急啊,大位高手能帮我解释这是为什么???
这是我产生的 50 万条记录,我在 bName 和 bAdrress 上建立的索引,查询某条记录:
select * from bigTable
where bNumber=26152 --bName='塻峚垃廑' and bAdrress='姎乪匽悥倱噓侕愎代嬂'
时间花费 0 秒,你可以试试:
CREATE TABLE bigTable(
bID int identity(1,1) primary key,
bName varchar(10),
bAdrress varchar(20),
bText varchar(100),
bNumber int,
bSum datetime
)
GO
--select NCHAR(19968)
--select NCHAR(40869)
select * from bigTable
declare @random_number int,@seed int, @i int, @j int
declare @random_Name varchar(10),@random_Adrress varchar(20),@random_Text varchar(100)
set @i = 0
set @seed=5
WHILE (@i < 500000)
BEGIN
select @random_Name='',@random_Adrress='', @random_Text=''
--首先产生长度为4个汉字的 bName
WHILE (@j < 4)
begin
select @random_number=5 * power(10,3) * rand() + 2 * power(10,4)
select @random_Name=@random_Name+NCHAR(cast(@random_number as int))
set @j =@j+1
end
--产生长度为20个汉字的 bName
set @j=0
WHILE (@j < 20)
begin
select @random_number=5 * power(10,3) * rand() + 2 * power(10,4)
select @random_Adrress=@random_Adrress+NCHAR(cast(@random_number as int))
set @j =@j+1
end
set @j=0
--产生长度为50个汉字的 bName
WHILE (@j < 99)
begin
select @random_number=5 * power(10,3) * rand() + 2 * power(10,4)
select @random_Text=@random_Text+NCHAR(cast(@random_number as int))
set @j =@j+1
end
set @j=0
--产生10000到99999的整数个汉字的 bName
SET @random_number=(power(10,@seed)-1-power(10,@seed-1))*rand()+power(10,@seed-1)
INSERT INTO bigTable VALUES(@random_Name,@random_Adrress,@random_Text,@random_number,getdate())
SET @i = @i + 1
END