
# 合理使用DDL(Data Definition Languages)语句
数据库模式定义语言DDL(Data Definition Language)，是用于描述数据库中存储实体的语言，例如创建、修改和删除数据库、集合的结构。
DDS中常见的DDL包括：
- 创建集合（createCollection）：用于在指定的数据库中创建一个新的集合。
- 删除集合（drop）：用于删除指定的集合。
- 创建索引（createIndex）：用于在集合中创建一个或多个索引，以提高查询效率。
- 删除索引（dropIndex）：用于从集合中删除指定的索引。
- 修改集合的分片规则（shardCollection）：使用sh.shardCollection命令修改集合的分片规则，将集合分布在不同的分片中。
- 查看集合的元数据（collection.stats）：用于查看指定集合的元数据信息，如文档数量、存储大小等。
- 查看数据库的元数据（db.stats）：用于查看指定数据库的元数据信息，如集合数量、存储。
#### 使用DDL的注意事项
- 创建索引、删除索引、删除集合等操作会消耗大量IO/计算资源，需要在业务的低峰期执行，避免影响业务。
- 避免多个DDL操作同时执行，可能会引起阻塞导致执行失败。例如：创建索引和删除集合不要同时执行。
- 创建索引时，只创建必要的索引，避免创建多余索引导致存储空间浪费。例如：不要基于复合索引的前缀字段再创建索引。
- 创建索引时，需要创建后台索引，即：db.\<collection_name\>.createIndex({ \<field_name\>: \<index_type\> }, { background: true })，注意，后台索引不会阻塞其他业务，但是仍然会消耗大量IO资源。
- 在删除索引时，需要先进行性能测试，确保删除的索引不会影响查询性能。
- 创建集合时，应避免创建过多集合，集合数量太多会产生大量元数据并消耗额外资源，且非常难以维护。例如：应避免以日期命名集合并每天创建一个新的集合，考虑将日期作为字段存储到同一集合中。
- 删除集合前，需要谨慎确认集合名称，因为集合删除后无法直接恢复数据，建议先备份重要数据。
- 遇到全表删除的场景，避免使用不带过滤条件的remove、delete命令进行删除，尽量使用db.\<collection_name\>.drop()删除集合来替代。remove、delete若有查询条件，也必须创建对应的索引。
- 对于DDS集群实例，如果某个集合的存储量很高，需要对该集合设置合理的数据分片，详情请参考[通过设置数据分片提升性能](https://support.huaweicloud.com/usermanual-dds/dds_01_0061.html)。
- 对于数据库和集合的元数据信息（如文档数量、存储大小等），可以使用db.stats()和db.\<collection_name\>.stats()方法进行查看。这些信息对于性能优化和容量规划非常重要。
 
