PHP编程:MySQL索引经历之高见
咱们就开始学习动态语言的概念吧,刚一接触动态语言,可能很多人都会蒙了,怎么这乱七八糟的东西,在网页里显示的时候却是另外一码事?其实这并不算乱七八糟,你写的HTML代码不也一样是一堆堆的字符吗?毕竟,代码并不是作为直接输出的,而是经过处理的,说白了,HTML是经过HTML解析器,而PHP当然也就通过PHP解析器了,跟学习HTML一样的道理,想让任何的解析器完成操作,就必须使用它们专用的语法结构,所以PHP长相奇怪也就不足为奇了。mysql|索引 在数据库表中,利用索引可以大大进步查询速度。假设咱们创立了一个testIndex表:
CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL);
咱们随机向外面拔出了1000笔记录,个中有一条
i_testID vc_Name
555 erquan
在查找vc_Name="erquan"的纪录
SELECT * FROM testIndex WHERE vc_Name='erquan';
时,假如在vc_Name上已创立了索引,MySql不必任何扫描,即正确可找到该纪录!相反,MySql会扫描一切纪录,即要查询1000次啊~~可以索引将查询速度进步100倍。
1、索引分单列索引和组合索引
单列索引:即一个索引只包括单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引:即一个索包括多个列。
2、引见一下索引的类型
1.通俗索引。
这是最根基的索引,它没有任何限制。它有以下几种创立体例:
(1)创立索引:CREATE INDEX indexName ON tableName(tableColumns(length));假如是CHAR,VARCHAR类型,length可以小于字段实践长度;假如是BLOB 和 TEXT 类型,必需指定length,下同。
(2)修正表布局:ALTER tableName ADD INDEX ON (tableColumns(length))
(3)创立表的时分直接指定:CREATE TABLE tableName ( [...], INDEX (tableColumns(length)) ;
2.独一索引。
它与后面的"通俗索引"相似,分歧的就是:索引列的值必需独一,但答应有空值。假如是组合索引,则列值的组合必需独一。它有以下几种创立体例:
(1)创立索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修正表布局:ALTER tableName ADD UNIQUE ON (tableColumns(length))
(3)创立表的时分直接指定:CREATE TABLE tableName ( [...], UNIQUE (tableColumns(length));
3.主键索引
它是一种特别的独一索引,不答应有空值。通常为在建表的时分同时创立主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 固然也能够用ALTER号令。
记住:一个表只能有一个主键。
4.全文索引
MySQL从3.23.23版入手下手撑持全文索引和全文检索。这里不作会商,呵呵~~
删除索引的语法:DROP INDEX index_name ON tableName
3、单列索引和组合索引
为了抽象地对照二者,再建一个表:
CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );
在这10000笔记录外面7上8下地散布了5条vc_Name="erquan"的纪录,只不外city,age,school的组合各不不异。
来看这条T-SQL:
SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;
起首思索建单列索引:
在vc_Name列上创立了索引。履行T-SQL时,MYSQL很快将方针锁定在了vc_Name=erquan的5笔记录上,掏出来放到一两头了局集。在这个了局集里,先扫除失落vc_City不等于"郑州"的纪录,再扫除i_Age不等于25的纪录,最初挑选出独一的合适前提的纪录。
固然在vc_Name上创立了索引,查询时MYSQL不必扫描整张表,效力有所进步,但离咱们的请求还有必定的间隔。一样的,在vc_City和i_Age分离创立的单列索引的效力类似。
为了进一步榨取MySQL的效力,就要思索创立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里:
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注重了,建表时,vc_Name长度为50,这里为何用10呢?由于普通情形下名字的长度不会超越10,如许会减速索引查询速度,还会削减索引文件的巨细,进步INSERT的更新速度。
履行T-SQL时,MySQL不必扫描任何纪录就到找到独一的纪录!!
一定有人要问了,假如分离在vc_Name,vc_City,i_Age上创立单列索引,让该表有3个单列索引,查询时和上述的组合索引效力一样吧?嘿嘿,大纷歧样,远远低于咱们的组合索引~~固然此时有了三个索引,但MySQL只能用到个中的谁人它以为仿佛是最无效率的单列索引。
创立如许的组合索引,实际上是相当于分离创立了
vc_Name,vc_City,i_Age
vc_Name,vc_City
vc_Name
如许的三个组合索引!为何没有vc_City,i_Age等如许的组合索引呢?这是由于mysql组合索引"最左前缀"的了局。复杂的了解就是只从最左面的入手下手组合。并非只需包括这三列的查询城市用到该组合索引,上面的几个T-SQL会用到:
SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而上面几个则不会用到:
SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_City="郑州"
4、利用索引
到此你应当会创立、利用索引了吧?但甚么情形下需求创立索引呢?普通来讲,在WHERE和JOIN中呈现的列需求创立索引,但也不完整如斯,由于MySQL只对 <,<=,=,>,>=,BETWEEN,IN,和某些时分的LIKE(前面有申明)才会利用索引。
SELECT t.vc_Name FROM testIndex t LEFT JOIN myIndex m ON t.vc_Name=m.vc_Name WHERE m.i_Age=20 AND m.vc_City='郑州'时,有对myIndex表的vc_City和i_Age创立索引的需求,因为testIndex表的vc_Name开呈现在了JOIN子句中,也有对它创立索引的需要。
方才提到了,只要某些时分的LIKE才需创立索引?是的。由于在以通配符 % 和 _ 开首作查询时,MySQL不会利用索引,如
SELECT * FROM myIndex WHERE vc_Name like'erquan%'
会利用索引,而
SELECT * FROM myIndex WHEREt vc_Name like'%erquan'
就不会利用索引了。
5、索引的缺乏的地方
下面说了那末多索引的坏话,它真的有像传说中那末优异么?固然会出缺点了。
1.固然索引大大进步了查询速度,同时却会下降更新表的速度,如对表停止INSERT、UPDATE和DELETE。由于更新表时,MySQL不但要保留数据,还要保留一下索引文件
2.创立索引会占用磁盘空间的索引文件。普通情形这个成绩不太严重,但假如你在一个大表上创立了多种组合索引,索引文件的会收缩很快。
篇尾:
讲了这么多,不过是想使用索引进步数据库的履行效力。不外索引只是进步效力的一个要素。假如你的MySQL有大数据的表,就需求花工夫研讨创立最优异的索引或优化查询语句。
假如你感觉下面有不当的中央或有分歧的定见或有需求增补的中央,接待跟贴会商^_^。
参考:MYSQL中文手册、MYSQL在线手册、SQLSERVER联机丛书、PC163-IT指南
erquan
2003/2/25 下战书于郑州 看到好的帖子最好up一下,以使得更多的人得到分享。 要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。 作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。 基础有没有对学习php没有太大区别,关键是兴趣。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
页:
[1]