MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,以最左边的为起点任何连续的索引都能匹配上,同时遇到范围查询(>、<、between、like)就会停止匹配。。
我先说一下,我从看来的文章里理解的内容。
例如,我创建了一张表,有A、B、C三个属性。我们在此基础上创建联合索引(A、B、C),实际上这是创建了三个索引,(A)(A、B)(A、B、C)。我们通过索引查询的时候,就可以查(A=?、B=?),Sql语言甚至有自动检测功能,当你输入的顺序不是按照索引的顺序时,例如,(B=?,A=?,C=?),这也是可以按照索(A、B、C)引来进行查找的。但是如果是查找(B=?,C=?)的时候,这时用的不是创建的索引(A、B、C),而是全索引,这是跟它的底层原理相关的,下面再谈。如果又有一个查询(A、B、C),不过B是范围查找的话,索引也只到A、B,因为B是范围查找,后面的字段就会停止匹配。
从上面可以看出最左前缀原则是在检索数据时按照规定的索引顺序来的。
这里有一片文章,介绍的比较详细,大家可以去看看。文章中有实例的测试,更加详细。
网页链接
底层原理
首先要知道,最左前缀原则是针对联合索引的,索引就要知道联合索引的实现原理。
它的底层是一个B+树,但键值数是大于1的。而构建一个B+树就只能根据一个键值来进行,所以数据库依据联合索引最左的字段来构建B+树。
下面是一个(A、B)的联合索引。
可以看到A是有顺序的,但是B不是,B的顺序是建立在A的基础上的。所以最左前缀原则是根据索引先匹配A,在匹配B。如果没有A,直接查找B的话,这就用不到(A、B)索引,而是全索引。
方法/步骤命令行登陆MySQL,进入相应的数据库,本例是shopping(注:用其他工具也可以,比如Navicat for MySQL)。
输入查询表语句查看有哪些表:
select table_name FROM information_schema.tables
查询结果有许多表,以shopping开头的是我自己建立的,其他的是数据库系统自己建立的。
输入下面语句,查询以shopping开头的数据表:
select table_name FROM information_schema.tables where table_name like 'shopping_%'
输入下面语句:
Select CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO buy_', substring(table_name,9 ),'' )FROM information_schema.tablesWhere table_name LIKE 'shopping_%'
注意:9表示从“shopping_”后面开始
拷贝出以alter开头的所有语句,用Navicat for MySQL工具更直观。
ALTER TABLE shopping__admin RENAME TO buy___adminALTER TABLE shopping__adminlog RENAME TO buy___adminlogALTER TABLE shopping__article RENAME TO buy___articleALTER TABLE shopping__basket RENAME TO buy___basketALTER TABLE shopping__book RENAME TO buy___bookALTER TABLE shopping__comment RENAME TO buy___commentALTER TABLE shopping__gb RENAME TO buy___gbALTER TABLE shopping__gou RENAME TO buy___gouALTER TABLE shopping__huo RENAME TO buy___huoALTER TABLE shopping__hw RENAME TO buy___hwALTER TABLE shopping__logo RENAME TO buy___logoALTER TABLE shopping__newsnsort RENAME TO buy___newsnsortALTER TABLE shopping__newssort RENAME TO buy___newssortALTER TABLE shopping__nsort RENAME TO buy___nsortALTER TABLE shopping__pay RENAME TO buy___payALTER TABLE shopping__payonline RENAME TO buy___payonlineALTER TABLE shopping__pinpai RENAME TO buy___pinpaiALTER TABLE shopping__ps RENAME TO buy___psALTER TABLE shopping__pub RENAME TO buy___pubALTER TABLE shopping__quan RENAME TO buy___quanALTER TABLE shopping__rep RENAME TO buy___repALTER TABLE shopping__rule RENAME TO buy___ruleALTER TABLE shopping__search RENAME TO buy___searchALTER TABLE shopping__sort RENAME TO buy___sortALTER TABLE shopping__sub RENAME TO buy___subALTER TABLE shopping__system RENAME TO buy___systemALTER TABLE shopping__totime RENAME TO buy___totimeALTER TABLE shopping__type RENAME TO buy___typeALTER TABLE shopping__user RENAME TO buy___userALTER TABLE shopping__usertype RENAME TO buy___usertypeALTER TABLE shopping__wrzcnet_ad RENAME TO buy___wrzcnet_adALTER TABLE shopping__wrzcnet_link RENAME TO buy___wrzcnet_linkALTER TABLE shopping__zp RENAME TO buy___zp
运行拷贝的语句:
执行完后,在用上面的查询语句查询一下:
select table_name FROM information_schema.tables where table_name like 'shopping_%'
发现没有数据,说明修改成功;修改查询语句:
select table_name FROM information_schema.tables where table_name like 'buy_%'
在phpmyadmin中先运行(假设前缀是"abc"):select concat('drop table ', table_name, '')
from information_schema.tables
where table_name like 'abc_%'
然后把执行的结果从网页中复制出来,粘贴到记事本中,把记事本中的文件另存为:droptable.sql 。(文件类型中选“所有文件”)
在phpmyadmin中,顶部的菜单中,有“import”,点击后,你把新建的文件上传上去,然后点击右下方的“执行”
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)