# 尽量避免全表扫描

__*避免全表扫描最佳实践*__

+ 用 IN/UNION 替换 OR,并且注意 IN 操作的对象数量应该小于 300 个
+ 避免使用 **%** 前缀进行模糊前缀查询
+ 全表数据删除时推荐使用 **TRUNCATE**

-------------------------------------------------------
- WHERE 条件中不要在索引列上进行数学运算或函数运算；

- 用 in/union 替换 or,并注意 in 操作的对象数量应该小于 300 个；

- 避免使用 % 前缀进行模糊前缀查询；

- 如应用使用 Multi Statements 执行 SQL,即将多个 SQL 使用分号连接,一次性地发给客户端执行,TiDB 只会返回第一个 SQL 的执行结果。

- 删除表中全部的数据时,推荐使用 TRUNCATE 或者 重建（DROP then CREATE 的方式,或者使用分区表中的DROP/TRUNCATE PARTITION 的方式, 或者带有条件的DELETE where condition ..limit N的循环方式。DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DROP 操作,在达到 TiDB 的 GC (garbage collection) 时间后（默认 10 分钟. ,TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作 TiDB 的 GC 机制会删除数据,但不会释放空间,而是当后续数据写入 RocksDB 且进行 compact 时对空间重新利用。