海口网站建设价格,建筑工程承包合同,网站图片搜索技术哪里可以做,桐城做淘宝店铺网站公司目录
1. 查询语句中使用LIKE关键字
例 1
2. 查询语句中使用多列索引
例 2
3. 查询语句中使用OR关键字
例 3
总结 索引可以提高查询的速度#xff0c;但并不是使用带有索引的字段查询时#xff0c;索引都会起作用。使用索引有几种特殊情况#xff0c;在这些情况下但并不是使用带有索引的字段查询时索引都会起作用。使用索引有几种特殊情况在这些情况下有可能使用带有索引的字段查询时索引并没有起作用下面重点介绍这几种特殊情况。
1. 查询语句中使用LIKE关键字
在查询语句中使用 LIKE 关键字进行查询时如果匹配字符串的第一个字符为“%”索引不会被使用。如果“%”不是在第一个位置索引就会被使用。
例 1
为了便于理解我们先查询 tb_student 表中的数据SQL 语句和运行结果如下
mysql SELECT * FROM tb_student;
----------------------
| id | name | age | sex |
----------------------
| 1 | 张三 | 12 | 男 |
| 2 | 李四 | 12 | 男 |
| 3 | 王五 | 13 | 女 |
| 4 | 张四 | 13 | 女 |
| 5 | 王四 | 15 | 男 |
| 6 | 赵六 | 12 | 女 |
----------------------
6 rows in set (0.03 sec)
下面在查询语句中使用 LIKE 关键字且匹配的字符串中含有“%”符号使用 EXPLAIN 分析查询情况SQL 语句和运行结果如下
mysql EXPLAIN SELECT * FROM tb_student WHERE name LIKE %四\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 6filtered: 16.67Extra: Using where
1 row in set, 1 warning (0.01 sec)mysql CREATE INDEX index_name ON tb_student(name);
Query OK, 6 rows affected (0.13 sec)mysql EXPLAIN SELECT * FROM tb_student WHERE name LIKE 李%\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: range
possible_keys: index_namekey: index_namekey_len: 77ref: NULLrows: 1filtered: 100.00Extra: Using index condition
1 row in set, 1 warning (0.00 sec)
第一个查询语句执行后rows 参数的值为 6表示这次查询过程中查询了 6 条记录第二个查询语句执行后rows 参数的值为 1表示这次查询过程只查询 1 条记录。同样是使用 name 字段进行查询因为第一个查询语句的 LIKE 关键字后的字符串是以“%”开头的所以第一个查询语句没有使用索引而第二个查询语句使用了索引 index_name。
2. 查询语句中使用多列索引
多列索引是在表的多个字段上创建一个索引只有查询条件中使用了这些字段中的第一个字段索引才会被使用。
例 2
在 name 和 age 两个字段上创建多列索引并验证多列索引的使用情况SQL 语句和运行结果如下
mysql CREATE INDEX index_name_age ON tb_student(name,age);
Query OK, 6 rows affected (0.11 sec)mysql EXPLAIN SELECT * FROM tb_student WHERE name LIKE 李%\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: range
possible_keys: index_name_agekey: index_name_agekey_len: 77ref: NULLrows: 1filtered: 100.00Extra: Using index condition
1 row in set, 1 warning (0.05 sec)mysql EXPLAIN SELECT * FROM tb_student WHERE age LIKE 12\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 6filtered: 16.67Extra: Using where
1 row in set, 1 warning (0.00 sec)
第一条查询语句的查询条件使用了 name 字段分析结果显示 rows 参数的值为 1且查询过程中使用了 index_name_age 索引。第二条查询语句的查询条件使用了 age 字段结果显示 rows 参数的值为 6且 key 参数的值为 NULL这说明第二个查询语句没有使用索引。 因为 name 字段是多列索引的第一个字段所以只有查询条件中使用了 name 字段才会使 index_name_age 索引起作用。
3. 查询语句中使用OR关键字
查询语句只有 OR 关键字时如果 OR 前后的两个条件的列都是索引那么查询中将使用索引。如果 OR 前后有一个条件的列不是索引那么查询中将不使用索引。
例 3
下面演示 OR 关键字的使用。
mysql EXPLAIN SELECT * FROM tb_student WHERE name张三 or sex男\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL
possible_keys: index_name,index_name_agekey: NULLkey_len: NULLref: NULLrows: 6filtered: 30.56Extra: Using where
1 row in set, 1 warning (0.06 sec)
mysql EXPLAIN SELECT * FROM tb_student WHERE name张三 or id12\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: index_merge
possible_keys: PRIMARY,index_name,index_name_agekey: index_name,PRIMARYkey_len: 77,4ref: NULLrows: 2filtered: 100.00Extra: Using union(index_name,PRIMARY); Using where
1 row in set, 1 warning (0.01 sec)
由于 sex 字段没有索引所以第一条查询语句没有使用索引name 字段和 id 字段都有索引所以第二条查询语句使用了 index_name 和 PRIMARY 索引 。
总结
使用索引查询记录时一定要注意索引的使用情况。例如LIKE 关键字配置的字符串不能以“%”开头使用多列索引时查询条件必须要使用这个索引的第一个字段使用 OR 关键字时OR 关键字连接的所有条件都必须使用索引。