status字段0或者1,判断是否审核通过,0只是最新几行会出现,后面几十万行,都是1.请问是否需要创建索引?
试验了一下:参考下,表结构如下如,sql总共1010000条数据。前99条status=0 后面都为1:
status建立索引前:
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.166s
[SQL]
SELECT * from sys_user where `status` = 0 ;
受影响的行: 0
时间: 0.235s
[SQL]
SELECT * from sys_user where `status` = 1 ;
受影响的行: 0
时间: 0.514s
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.165s
[SQL]
SELECT * from sys_user where `status` = 0 ;
受影响的行: 0
时间: 0.232s
[SQL]
SELECT * from sys_user where `status` = 1 ;
受影响的行: 0
时间: 0.515s
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.165s
[SQL]
SELECT * from sys_user where `status` = 0 ;
受影响的行: 0
时间: 0.232s
[SQL]
SELECT * from sys_user where `status` = 1 ;
受影响的行: 0
时间: 0.512s
status建立索引后:
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.148s
[SQL]
SELECT * from sys_user where `status` = 0 ;
受影响的行: 0
时间: 0.001s
[SQL]
SELECT * from sys_user where `status` = 1 ;
受影响的行: 0
时间: 1.098s
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.147s
[SQL]
SELECT * from sys_user where `status` = 0 ;
受影响的行: 0
时间: 0.001s
[SQL]
SELECT * from sys_user where `status` = 1 ;
受影响的行: 0
时间: 1.098s
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.147s
[SQL]
SELECT * from sys_user where `status` = 0 ;
受影响的行: 0
时间: 0.001s
[SQL]
SELECT * from sys_user where `status` = 1 ;
受影响的行: 0
时间: 1.137s
不需要的,请求表上的数据行超出表总记录数30%,变成全表扫描,这时候如果使用索引反而开销更大, 所以即使加了索引mysql也不会用的。
过多相同不建议使用索引
不需要呀,太多的相同的数据了
相同数据过多,不建议使用索引了~~~
先回答:不需要
索引是否需要创建,需要看业务情况,如果某个字段经常在某些调用非常高的业务中 处在 where 查询条件下。那么就需要进行索引。
不过,对于像你这样的情况,如果数据量确实很大,那么在创建时间上弄一个索引,然后按照时间取最近一周的,再辨别 status 是否是0 。这样要快得多。
补充一下带分页的 ,再参考下,结果可能会不一样
索引前:
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.165s
[SQL]
SELECT * from sys_user where `status` = 0;
受影响的行: 0
时间: 0.233s
[SQL]
SELECT * from sys_user where `status` = 0 limit 0,1000;
受影响的行: 0
时间: 0.232s
[SQL]
SELECT * from sys_user where `status` = 1;
受影响的行: 0
时间: 0.517s
[SQL]
SELECT * from sys_user where `status` = 1 limit 0,1000;
受影响的行: 0
时间: 0.001s
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.165s
[SQL]
SELECT * from sys_user where `status` = 0;
受影响的行: 0
时间: 0.232s
[SQL]
SELECT * from sys_user where `status` = 0 limit 0,1000;
受影响的行: 0
时间: 0.232s
[SQL]
SELECT * from sys_user where `status` = 1;
受影响的行: 0
时间: 0.521s
[SQL]
SELECT * from sys_user where `status` = 1 limit 0,1000;
受影响的行: 0
时间: 0.001s
索引后:
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.147s
[SQL]
SELECT * from sys_user where `status` = 0;
受影响的行: 0
时间: 0.000s
[SQL]
SELECT * from sys_user where `status` = 0 limit 0,1000;
受影响的行: 0
时间: 0.000s
[SQL]
SELECT * from sys_user where `status` = 1;
受影响的行: 0
时间: 1.091s
[SQL]
SELECT * from sys_user where `status` = 1 limit 0,1000;
受影响的行: 0
时间: 0.002s
[SQL]select count(*) from sys_user ;
受影响的行: 0
时间: 0.146s
[SQL]
SELECT * from sys_user where `status` = 0;
受影响的行: 0
时间: 0.001s
[SQL]
SELECT * from sys_user where `status` = 0 limit 0,1000;
受影响的行: 0
时间: 0.001s
[SQL]
SELECT * from sys_user where `status` = 1;
受影响的行: 0
时间: 1.097s
[SQL]
SELECT * from sys_user where `status` = 1 limit 0,1000;
受影响的行: 0
时间: 0.001s
就两个值,你建索引干嘛
你不嫌麻烦,可添加索引,这样标注清楚些
如果只查status=0的数据是可以加一个的