MySQL 优化的一环是要做索引,B-tree 索引要左侧优先匹配,在使用 sequelize 查询的时候,where 条件需要匹配索引来进行优化。 但是我最近发现个别的查询跟预想的不一样,没用按照自定义的查询条件顺序拼接 SQL。比如:
User 表 Model id, nickname, createTime, state
对应数据库的表结构 id, nickname, create_time, state
查询的代码片段:
await User.findAll({
attributes: ['id'],
where: {
id: {
$gt: 1000
},
createTime: moment().format('YYYY-MM-DD HH:mm:ss'),
nickname: '123123',
},
offset: 0,
limit: 20
})
await User.findAll({
attributes: ['id'],
where: {
id: {
$gt: 1000
},
nickname: '123123',
createTime: moment().format('YYYY-MM-DD HH:mm:ss'),
},
offset: 0,
limit: 20
})
很明显,查询条件里 nickname, createTime 是有先后顺序传入的, 但是打印的 sql 都是一样的:
打印 sql:
SELECT `id` FROM `user` AS `User` WHERE `User`.`id` > 1000 AND `User`.`nickname` = '123123' AND `User`.`create_time` = '2019-09-27 14:41:52' LIMIT 0, 20;
但是有些条件就可以按传入顺序拼接:
await User.findAll({
attributes: ['id'],
where: {
avatar: 'xx',
id: {
$gt: 1000
},
},
offset: 0,
limit: 20
})
// SQL
// SELECT `id` FROM `user` AS `User` WHERE `User`.`avatar` = 'xx' AND `User`.`id` > 1000 LIMIT 0, 20;
await User.findAll({
attributes: ['id'],
where: {
id: {
$gt: 1000
},
avatar: 'xx'
},
offset: 0,
limit: 20
})
// SELECT `id` FROM `user` AS `User` WHERE `User`.`id` > 1000 AND `User`.`avatar` = 'xx' LIMIT 0, 20;
求高人指点,提供点思路。