sql如下: UPDATE t_access_token SET state = 1 WHERE state = 0 AND account = ""账号,每条sql值都不一样"" AND token <> ""令牌,每条sql值都不一样""; 仅仅是测试2000个线程,每个线程才跑一遍,效率都非常差,平均每个线程差不多要10秒。 |
|
10分 |
是不是 where 的字段没有索引
|
有的,where的三个字段都分别加上了索引 |
|
20分 |
贴出 explain select * from t_access_token WHERE?state?=?0?
AND?account?=?””账号,每条sql值都不一样””? AND?token?<>?””令牌,每条sql值都不一样””; 的结果以供分析。 |
20分 |
1.看一下存储引擎是否为myisam。如果是myisam则改为innodb。
show create table t_access_token; 如果是myisam则修改为innodb: alter table t_access_token engine=innodb; 2.看一下执行计划,并贴出结果。 explain select * from t_access_token where state=0 and account=””xxx”” and token <> “”xxx””; |
谢谢回答,表是Innodb引擎 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t_access_token index_merge idx_accesstoken_token,idx_accesstoken_state,idx_accesstoken_account idx_accesstoken_state,idx_accesstoken_account 4,66 523 Using intersect(idx_accesstoken_state,idx_accesstoken_account); Using where |
|
10分 |
索引没有创建。
create index sss on t_access_token(state,account,token); |
10分 |
个人意见:如果索引这样建立,猜测表中state字段=0的数据应该占表中总数据大于10% |
是分成三个索引来建的,合起来就不会有问题了吗 |
|
好的,我明天合起来测下 |
|
10分 |
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 |
10分 |
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 |
明白了,但是像我这条需要过滤的语句,如果不用<>,要怎么写 |
|
10分 |
看看把前两者建立一个索引,最后哪个单独建一个索引。这个不敢肯定呀。 |