|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
可以在书上很方便地做标记,及时记下自己的心得体会。数据|数据库|索引 接着,来个略微庞杂一点的,假如有个ORDER BY字句呢?不论你信不信,大多半的数据库在利用order by的时分,都将会从索引中受害。
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
有点利诱了吧?很复杂,就象为where字句中的字段创立一个索引一样,也为ORDER BY的字句中的字段创立一个索引:
CREATE INDEX mytable_categoryid_userid_adddate
ON mytable (category_id,user_id,adddate);
注重: "mytable_categoryid_userid_adddate" 将会被截短为
"mytable_categoryid_userid_addda"
CREATE
EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
NOTICE: QUERY PLAN:
Sort (cost=2.03..2.03 rows=1 width=16)
-> Index Scan using mytable_categoryid_userid_addda
on mytable (cost=0.00..2.02 rows=1 width=16)
EXPLAIN
看看EXPLAIN的输入,好象有点可骇啊,数据库多做了一个咱们没有请求的排序,这下晓得功能若何受损了吧,看来咱们关于数据库的本身运作是有点过于悲观了,那末,给数据库多一点提醒吧。
为了跳过排序这一步,咱们其实不需求其它别的的索引,只需将查询语句略微改一下。这里用的是postgres,咱们将给该数据库一个额定的提醒--在ORDER BY语句中,到场where语句中的字段。这只是一个手艺上的处置,并非必需的,由于实践上在别的两个字段上,其实不会有任何的排序操作,不外假如到场,postgres将会晓得哪些是它应当做的。
EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY category_id DESC,user_id DESC,adddate DESC;
NOTICE: QUERY PLAN:
Index Scan Backward using
mytable_categoryid_userid_addda on mytable
(cost=0.00..2.02 rows=1 width=16)
EXPLAIN
如今利用咱们意料的索引了,并且它还挺伶俐,晓得可以从索引前面入手下手读,从而防止了任何的排序。
以上说得细了一点,不外假如你的数据库十分伟大,而且逐日的页面恳求达上百万算,我想你会获益很多的。不外,假如你要做更加庞杂的查询呢,例如将多张表联合起来查询,出格是where限制字句中的字段是来自不止一个表格时,应当如何处置呢?我凡是都尽可能防止这类做法,由于如许数据库要将各个表中的器材都联合起来,然后再扫除那些不适合的行,弄欠好开支会很大。
假如不克不及防止,你应当检查每张要联合起来的表,而且利用以上的战略来创立索引,然后再用EXPLAIN号令验证一下是不是利用了你意料中的索引。假如是的话,就OK。不是的话,你能够要创立一时的表来将他们联合在一同,而且利用恰当的索引。
要注重的是,创立太多的索引将会影响更新和拔出的速度,由于它需求一样更新每一个索引文件。关于一个常常需求更新和拔出的表格,就没有需要为一个很少利用的where字句独自创立索引了,关于对照小的表,排序的开支不会很大,也没有需要创立别的的索引。
以上引见的只是一些非常根基的器材,其实外面的学问也很多,单凭EXPLAIN咱们是不克不及剖断该办法是不是就是最优化的,每一个数据库都有本人的一些优化器,固然能够还不太完美,然而它们城市在查询时对照过哪一种体例较快,在某些情形下,创立索引的话也未必会快,例如索引放在一个不一连的存储空间时,这会增添读磁盘的承当,因而,哪一个是最优,应当经由过程实践的利用情况来查验。
在刚入手下手的时分,假如表不大,没有需要作索引,我的定见是在需求的时分才作索引,也可用一些号令来优化表,例如MySQL可用"OPTIMIZE TABLE"。
综上所述,在若何为数据库创立得当的索引方面,你应当有一些根基的概念了。
当然你可以把你最基本的功能放出来的时候就放出来,比如放到论坛上,让大家都参与, |
|