关于数据库的表结构,我们首先来详细解析一下用户表tb_user
的结构要点:
第一点,需要强调的是,对索引列进行运算操作是应当避免的,因为这会导致索引失效。
具体来说,手机号字段phone
设有唯一索引。若在此字段上进行函数运算后进行查询,索引将无法发挥作用。
第二点,使用字符串类型字段时,必须加引号,否则即使查询结果不受影响,数据库仍会进行隐式类型转换,导致索引失效。
第三点涉及到模糊匹配的问题。如果只是进行尾部模糊匹配,索引不会失效;但若是头部模糊匹配,索引则会失效。这一点在编写SQL语句时需特别注意。
接下来,让我们深入探讨一下接下来SQL语句的执行效果及其执行计划。
在以下的查询语句中,都是基于profession
(专业)字段进行的查询。由于profession
字段设有普通索引,因此我们将重点关注模糊查询时,百分号(%)在关键字前后对索引生效的影响。
经过一番测试,我们发现,在like
模糊查询中,当百分号(%)置于关键字之后时,索引可以正常工作;而如果百分号(%)置于关键字之前,索引则会失效。
第四点要强调的是关于or
条件的使用。若使用or
连接多个条件,且条件中有的列有索引而有的列没有,那么即便有索引的列也无法被利用。
例如,若age
列没有建立索引,即使id
列有索引,整个查询也会因无法有效利用索引而变得低效。针对需要频繁查询的列,如age
, 也应考虑建立相应的索引。
最后一点是关于数据分布对索引使用的影响。MySQL在进行查询时会评估使用索引与全表扫描的代价。如果评估结果认为使用索引的代价高于全表扫描,那么MySQL将选择不使用索引。