| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
如果表里有一个多字段索引的话,那么该索引的任何最左前缀部分都可以被优化程序用来检索记录。例如,在 (col1, col2, col3) 上有一个索引,那么按字段组合 (col1), (col1, col2), 和 (col1, col2,col3) 搜索的时候都会用到索引。 网管有家bitscn.net
MySQL无法使用非最左前缀索引中的部分索引。假如有以下 SELECT 语句:
网管网www.bitscn.com
SELECT * FROM tbl_name WHERE col1=val1; SELECT * FROM tbl_name WHERE col2=val2; SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3; |
如果在 (col1, col2, col3) 上有一个索引,只有第一个查询用到索引了。第二和第三个尽管包括了索引字段,但是 (col2) 和 (col2, col3) 并非索引 (col1, col2, col3) 的最左前缀部分。
中国网管论坛bbs.bitsCN.com
当对字段做 =, >, >=, <, <=, 或 BETWEEN 比较操作时,也会用到索引。 网管u家u.bitscn@com
MySQL在做 LIKE 比较时也可能用到索引,如果 LIKE 的参数是非通配字符开始的固定字符串的话。以下的 SELECT 语句就用到了索引: 网管下载dl.bitscn.com
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'; |
第一个查询中,只有的 'Patrick' <= key_col < 'Patricl' 记录才会被检索到。第二个查询中,只检索 'Pat' <= key_col < 'Pau' 的记录。 网管论坛bbs_bitsCN_com
以下 SELECT 语句不使用索引:
网管u家u.bitsCN.com
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col; |
第一个语句中,LIKE 的参数是以通配符开始的。第二个语句中,LIKE 的参数不是一个常值。
网管有家bitscn.net
MySQL 4.0及更高会做一个额外的 LIKE 优化。如果使用 ... LIKE '%string%' 并且 string 超过3个字符,MySQL就会用 Turbo Boyer-Moore 算法来初始化模式,并且利用这个模式来加快搜索。 网管u家bitscn.net
用 col_name IS NULL 搜索时也会使用索引,如果字段 col_name 上有索引的话。 网管网www.bitscn.com
任何在 WHERE 子句中没有跨越全部 AND 级分句的索引都不会用来优化查询。换言之,想要启用一个索引,那么在任何 AND 分句中都必须使用索引的前缀字段。 网管u家www.bitscn.net
以下 WHERE 子句使用索引:
网管联盟bitsCN_com
网管下载dl.bitscn.com
|
0
|
评论加载中…