仓酷云
标题:
PHP网页编程之为数据库创立索引(二)
[打印本页]
作者:
不帅
时间:
2015-2-4 00:18
标题:
PHP网页编程之为数据库创立索引(二)
可以在书上很方便地做标记,及时记下自己的心得体会。数据|数据库|索引 接着,来个略微庞杂一点的,假如有个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"。
综上所述,在若何为数据库创立得当的索引方面,你应当有一些根基的概念了。
当然你可以把你最基本的功能放出来的时候就放出来,比如放到论坛上,让大家都参与,
作者:
透明
时间:
2015-2-4 11:14
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者:
活着的死人
时间:
2015-2-5 04:46
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者:
蒙在股里
时间:
2015-2-8 20:54
Ps:以上纯属原创,如有雷同,纯属巧合
作者:
灵魂腐蚀
时间:
2015-2-14 05:16
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者:
柔情似水
时间:
2015-3-3 07:29
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者:
谁可相欹
时间:
2015-3-14 14:34
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者:
兰色精灵
时间:
2015-3-17 11:10
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者:
海妖
时间:
2015-3-24 08:44
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者:
金色的骷髅
时间:
2015-3-29 15:05
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者:
若相依
时间:
2015-4-4 11:14
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者:
小妖女
时间:
2015-4-5 05:55
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者:
愤怒的大鸟
时间:
2015-4-11 11:28
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者:
冷月葬花魂
时间:
2015-4-12 02:22
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者:
再见西城
时间:
2015-4-12 06:18
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者:
小魔女
时间:
2015-4-12 08:20
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者:
深爱那片海
时间:
2015-4-21 06:36
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者:
变相怪杰
时间:
2015-4-28 21:24
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者:
爱飞
时间:
2015-5-1 16:12
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者:
不帅
时间:
2015-7-6 00:42
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2