
# 在使用了字符串处理函数后查询就不使用索引，该如何处理？
答：在索引列上使用函数处理后就不会走标准的索引，可以创建一个表达式索引，以lpad()函数为例。
```
--建表并插入数据。
gaussdb=# CREATE TABLE tbl_test (c1 varchar);
gaussdb=# INSERT INTO tbl_test VALUES (generate_series(1,10000));
--普通索引使用lpad()函数，查询不会使用该索引。
gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(c1);
gaussdb=# SET max_datanode_for_plan = 1;
gaussdb=# SET explain_perf_mode = normal;
--执行计划部分内容如下。
gaussdb=# EXPLAIN SELECT * FROM tbl_test WHERE lpad(c1,5,'0') = '00324';
                                          QUERY PLAN
-----------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Node/s: All datanodes
 Remote SQL: SELECT c1 FROM public.tbl_test WHERE lpad(c1::text, 5, '0'::text) = '00324'::text
 Datanode Name: datanode1
   Seq Scan on tbl_test  (cost=0.00..96.22 rows=25 width=32)
     Filter: (lpad((c1)::text, 5, '0'::text) = '00324'::text)
(8 rows)
--修改为表达式索引后，该查询会使用索引。
gaussdb=# DROP INDEX idx_test_c1;
gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(lpad(c1,5,'0'));
gaussdb=# EXPLAIN SELECT * FROM tbl_test WHERE lpad(c1,5,'0') = '00324';
                                          QUERY PLAN
-----------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Node/s: All datanodes
 Remote SQL: SELECT c1 FROM public.tbl_test WHERE lpad(c1::text, 5, '0'::text) = '00324'::text
 Datanode Name: datanode1
   Bitmap Heap Scan on tbl_test  (cost=1.55..18.09 rows=25 width=32)
     Recheck Cond: (lpad((c1)::text, 5, '0'::text) = '00324'::text)
     ->  Bitmap Index Scan on idx_test_c1  (cost=0.00..1.54 rows=25 width=0)
           Index Cond: (lpad((c1)::text, 5, '0'::text) = '00324'::text)
(10 rows)
--删除。
gaussdb=# DROP INDEX idx_test_c1;
gaussdb=# DROP TABLE tbl_test;
```
