0. 前言
转为使用PDManer设计数据库好长一段时间了,慢慢也习惯了这款软件的使用,遇到了一个小问题,记录下。一开始以为是PDManer的bug,现在看还是内置的模板不够完善。
1. 问题描述
PDManer导出的索引语句都是正序排序!
笔者在工作中遇到一个表设计的问题,取一个时间字段建立索引,倒叙排序,结果导出的DDL语句是正序排序,上线后出现了查询效率问题。
2. 模拟
现在简单模拟下,建表语句:
DROP TABLE IF EXISTS user_info;
CREATE TABLE user_info(
`id` INT(11) NOT NULL COMMENT '主键id' ,
`user_id` VARCHAR(16) COMMENT '用户id' ,
`user_name` VARCHAR(16) COMMENT '用户名称' ,
PRIMARY KEY (id)
) COMMENT = '用户信息表';
索引,这里设置字段为倒叙:
生成的索引语句:
CREATE UNIQUE INDEX idx_user_id ON user_info(user_id);
生成的DDL语句却还是默认的正序!
3. 编写代码模板
一开始以为是PDManer的bug,稍微研究了下,发现软件是根据代码模板来生成DDL语句,因此理论上来讲,可以生成任意想要的DDL语句。这个设计就挺有意思的!
内置代码模板为:
{{~ it.entity.indexes:index}}
CREATE {{? index.unique}}UNIQUE {{?}}INDEX {{=index.defKey}} ON {{=it.entity.defKey}}({{ fieldsKeys = index.fields.map(function(field){return field.fieldDefKey}) ; }}{{=it.func.join(...fieldsKeys,',')}});
{{~}}
看了dot.js语法
介绍,一开始以为要在function里面写{{? 条件表达式}}
,结果不起效,并且提示错误。想了想既然是function,那按JavaScript来写总没错吧。于是改为:
{{~ it.entity.indexes:index}}
CREATE {{? index.unique}}UNIQUE {{?}}INDEX {{=index.defKey}} ON {{=it.entity.defKey}}({{ fieldsKeys = index.fields.map(function(field){ if (field.ascOrDesc == 'D') {return field.fieldDefKey+' DESC'} else {return field.fieldDefKey+' ASC'} }) ; }}{{=it.func.join(...fieldsKeys,',')}});
{{~}}
关键JavaScript代码:
if (field.ascOrDesc == 'D') {
return field.fieldDefKey+' DESC'
} else {
return field.fieldDefKey+' ASC'
}
效果: