技术 > mysql
目录
mysql名字的来历
  mysql最初的开发者的意图是用msql和他们自己的快速低级例程(isam)去连接表格。不管怎样,在经过一些测试后,开发者得出结论:msql并没有他们需要的那么快和灵活。这导致了一个使用几乎和msql一样的api接口的用于他们的数据库的新的sql接口的产生,这样,这个api被设计成允许为用于msql而写的第三方代码更容易移植到mysql
  mysql这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,mysql ab创始人之一的monty widenius的女儿也叫my。这两个到底是哪一个给出了mysql这个名字至今依然是个密,包括开发者在内也不知道。
  mysql的海豚标志的名字叫“sakila”,它是由mysql ab的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者ambrose twebaze提供。根据ambrose所说,sakila来自一种叫siswati的斯威士兰方言,也是在ambrose的家乡乌干达附近的坦桑尼亚的arusha的一个小镇的名字。
mysql的概述
  mysql是一个小型关系型数据库管理系统,开发者为瑞典mysql ab公司。目前mysql被广泛地应用在internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了mysql作为网站数据库。
mysql的特性
  1.使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性
  2.支持aix、freebsd、hp-ux、linux、mac os、novell netware、openbsd、os/2 wrap、solaris、windows等多种操作系统
  3.为多种编程语言提供了api。这些编程语言包括c、c++、eiffel、java、perl、php、python、ruby和tcl等。
  4.支持多线程,充分利用cpu资源
  5.优化的sql查询算法,有效地提高查询速度
  6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的gb 2312、big5,日文的shift_jis等都可以用作数据表名和数据列名
  7.提供tcp/ip、odbc和jdbc等多种数据库连接途径
  8.提供用于管理、检查、优化数据库操作的管理工具
  9.可以处理拥有上千万条记录的大型数据库
mysql的应用
  与其他的大型数据库例如oracle、db2、sql server等相比,mysql自有它的不足之处,如规模小、功能有限(mysql不支持视图(已经被列入5.1版的开发计划)、事件等)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,mysql提供的功能已经绰绰有余,而且由于mysql是开放源码软件,因此可以大大降低总体拥有成本。
  目前internet上流行的网站构架方式是lamp(linux+apache+mysql+php),即使用linux作为操作系统,apache作为web服务器,mysql作为数据库,php作为服务器端脚本解释器。由于这四个软件都是遵循gpl的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。
mysql管理
  可以使用命令行工具管理mysql数据库(命令mysqlmysqladmin),也可以从mysql的网站下载图形管理工具mysql administrator和mysql query browser。
  phpmyadmin是由php写成的mysql资料库系统管理程式,让管理者可用web介面管理mysql资料库。
  phpmybackuppro也是由php写成的,可以透过web介面创建和管理数据库。它可以创建伪cronjobs,可以用来自动在某个时间或周期备份mysql 数据库。
mysql存储引擎
  myisam mysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务
  innodb 事务型数据库的首选引擎,支持acid事务,支持行级锁定
  bdb 源自berkeley db,事务型数据库的另一种选择,支持commit和rollback等其他事务特性
  memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在mysql重新启动时丢失
  merge 将一定数量的myisam表联合而成一个整体,在超大规模数据存储时很有用
  archive 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。archive拥有高效的插入速度,但其对查询的支持相对较差
  federated 将不同的mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
  cluster/ndb 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
  csv 逻辑上由逗号分割数据的存储引擎
  blackhole 黑洞引擎,写入的任何数据都会消失
  另外,mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。
mysql最常见的应用架构
  单点(single),适合小规模应用
  复制(replication),适合中小规模应用
  集群(cluster),适合大规模应用
mysql中文视频教学
  左光华的mysql网络数据库开发教学视频http://www.tudou.com/playlist/mysql/
  mysql6.0的alpha版于2007年初发布,新版增加了对falcon存储引擎的支持。falcon是mysql社区自主开发的引擎,支持acid特性事务,支持行锁,拥有高性能的并发性。mysql ab公司想用falcon替代已经非常流行的innodb引擎,因为拥有后者技术的innobase已经被竞争对手oracle所收购。
  2008年1月16日,sun microsystems宣布收购mysql ab,出价约10亿美元现金外加期权。 http://www.mysql.com/news-and-events/sun-to-acquire-mysqll
MySQL名字的来历
  mysql是一个小型关系型数据库管理系统,开发者为瑞典mysqlAB公司,在2008年1月16号被Sun公司收购。mysql被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了mysql作为网站数据库。
  mysql最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。不管怎样,在经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。这导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到mysql
  mysql这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,mysql AB创始人之一的Monty Widenius的女儿也叫My。这两个到底是哪一个给出了mysql这个名字至今依然是个迷,包括开发者在内也不知道。
  mysql的海豚标志的名字叫“sakila”,它是由mysql AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供。根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。
MySQL的概述
  mysql是一个小型关系型数据库管理系统,开发者为瑞典mysql AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracal收购.对于mysql的前途,没有任何人抱乐观的态度.目前mysql被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了mysql作为网站数据库。mysql的官方网站的网址是:www.mysql.com
Mysql最常见的应用架构
  单点(Single),适合小规模应用
  复制(Replication),适合中小规模应用
  集群(Cluster),适合大规模应用
  mysql公司在同时开发两个版本的软件,4.1版以及5.0版。4.1版本的代码已经发布并有望在8个月后公布最终代码。而5.0版本的最后产品将在6个月后发布。
  mysql4.1版本中增加了不少新的性能,包括对主键的更高速度的缓存,对子查询的更好的支持,以及应网络约会网站所要求的,基于地理信息的查询。
  其同步开发的5.0版本则把目标对准了企业用户,对于4.1版本中的所有新特性,5.0版本悉数收入囊中,并且独具以下特点:对外键的良好支持;系统自动报错机制以及对存储过程的充分支持。
MySQL的索引文件介绍
  索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止mysql在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。另外,索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
  从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但mysql把同一个数据表里的索引总数限制为16个。
  1、InnoDB数据表的索引
  与InnoDB数据表相比,在InnoDB数据表上,索引对InnoDB数据表的重要性要在得多。在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及INSERT、UPDATE和DELETE命令。出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。
  2、限制
  如果WEHERE子句的查询条件里有不等号(WHEREcoloum!=),mysql将无法使用索引。类似地,如果WHERE子句的查询条件里使用了函数(WHEREDAY(column)=),mysql也将无法使用索引。在JOIN操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引。
  如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,mysql只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE'abc%‘,mysql将使用索引;如果查询条件是LIKE'%abc’,mysql将不使用索引。
  在ORDERBY操作中,mysql只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快ORDERBY方面也没什么作用)。如果某个数据列里包含许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含的净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。
  mysql 普通索引、唯一索引和主索引
  1、普通索引
  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
  2、唯一索引
  普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。
  如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了mysql对这个索引的管理工作,这个索引也因此而变得更有效率;二是mysql会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,mysql将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
  3、主索引
  在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。
  4、外键索引
  如果为某个外键字段定义了一个外键约束条件,mysql就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。
  5、复合索引
  索引可以覆盖多个数据列,如像INDEX(columnA,columnB)索引。这种索引的特点是mysql可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA,columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A,B,C)可以当做A或(A,B)的索引来使用,但不能当做B、C或(B,C)的索引来使用。
  6、索引的长度
  在为CHAR和VARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个字段所允许的最大字符个数)。这么做的好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。在绝大多数应用里,数据库中的字符串数据大都以各种各样的名字为主,把索引的长度设置为10~15个字符已经足以把搜索范围缩小到很少的几条数据记录了。在为BLOB和TEXT类型的数据列创建索引时,必须对索引的长度做出限制;mysql所允许的最大索引全文索引文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以的形式出现,这对mysql来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
  这类场合正是全文索引(full-textindex)可以大显身手的地方。在生成这种类型的索引时,mysql将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:
  ALTERTABLEtablenameADDFULLTEXT(column1,column2)有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:
  SELECT*FROMtablename
  WHEREMATCH(column1,column2)AGAINST(‘word1','word2','word3’)
  上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。
  注解:InnoDB数据表不支持全文索引。
MySQL文件优化
  查询和索引的优化
  只有当数据库里已经有了足够多的测试数据时,它的性能测试结果才有实际参考价值。如果在测试数据库里只有几百条数据记录,它们往往在执行完第一条查询命令之后就被全部加载到内存里,这将使后续的查询命令都执行得非常快--不管有没有使用索引。只有当数据库里的记录超过了1000条、数据总量也超过了mysql服务器上的内存总量时,数据库的性能测试结果才有意义。
  在不确定应该在哪些数据列上创建索引的时候,人们从EXPLAINSELECT命令那里往往可以获得一些帮助。这其实只是简单地给一条普通的SELECT命令加一个EXPLAIN关键字作为前缀而已。有了这个关键字,mysql将不是去执行那条SELECT命令,而是去对它进行分析。mysql将以表格的形式把查询的执行过程和用到的索引等信息列出来。
  在EXPLAIN命令的输出结果里,第1列是从数据库读取的数据表的名字,它们按被读取的先后顺序排列。type列指定了本数据表与其它数据表之间的关联关系(JOIN)。在各种类型的关联关系当中,效率最高的是system,然后依次是const、eq_ref、ref、range、index和All(All的意思是:对应于上一级数据表里的每一条记录,这个数据表里的所有记录都必须被读取一遍——这种情况往往可以用一索引来避免)。
  possible_keys数据列给出了mysql在搜索数据记录时可选用的各个索引。key数据列是mysql实际选用的索引,这个索引按字节计算的长度在key_len数据列里给出。比如说,对于一个INTEGER数据列的索引,这个字节长度将是4。如果用到了复合索引,在key_len数据列里还可以看到mysql具体使用了它的哪些部分。作为一般规律,key_len数据列里的值越小越好。
  ref数据列给出了关联关系中另一个数据表里的数据列的名字。row数据列是mysql在执行这个查询时预计会从这个数据表里读出的数据行的个数。row数据列里的所有数字的乘积可以大致了解这个查询需要处理多少组合。
  最后,extra数据列提供了与JOIN操作有关的更多信息,比如说,如果mysql在执行这个查询时必须创建一个临时数据表,就会在extra列看到usingtemporary字样。
  mysql-安装注意
  mysql安装注意1、如果是用mysql+Apache,使用的又是FreeBSD网路操作系统的话,安装时候你应按注意到FreeBSD的版本问题,在FreeBSD的3.0以下版本来说,mysqlSource内含的MIT-pthread运行是正常的,但在这版本以上,你必须使用nativethreads,也就是加入一个with-named-thread-libs=-lc_r的选项。
  2、如果在COMPILE过程中出了问题,请先检查你的gcc版本是否在2.81版本以上,gmake版本是否在3.75以上。
  3、如果不是版本的问题,那可能是你的内存不足,请使用./configure--with-low-memory来加入。
  4、如果要重新做你的configure,那么你可以键入rmconfig.cache和makeclean来清除记录。
  5、把mysql安装在/usr/local目录下,这是缺省值,您也可以按照你的需要设定你所安装的目录。
mysql历史版本
  mysql公司目前在同时开发两个版本的软件,4.1版以及5.0版。4.1版本的代码已经发布并有望在8个月后公布最终代码。而5.0版本的最后产品将在6个月后发布。
  mysql4.1版本中增加了不少新的性能,包括对主键的更高速度的缓存,对子查询的更好的支持,以及应网络约会网站所要求的,基于地理信息的查询。
  而其同步开发的5.0版本则把目标对准了企业用户,对于4.1版本中的所有新特性,5.0版本悉数收入囊中,并且独具以下特点:对外键的良好支持;系统自动报错机制以及对存储过程的充分支持。
   2009年初.mysql 5.4版预览本已放出.
MySQL的基本命令
  [ ]中的内容为可选项
  --创建数据库
  mysql> create database 数据库名称
  --创建表
  mysql> create table 表名 (
  列的名字(id)类型(int(4))primary key(定义主键) auto_increment(描述 自增),
  ……,
  );
  --查看所有数据库
  mysql> show databases 数据库名称;
  --使用某个数据库
  mysql> use database 数据库名称;
  --查看所使用数据库下所有的表
  mysql> show tables;
  --显示表的属性结构
  mysql> desc 表名;
  --选择表中数据的显示
  --* 代表选择所有列 ,
  mysql> select * from 表名 where id=?[and name=?] [or name=?];
  mysql> select id,name from 表名order by 某一列的名称 desc(降序,asc为升序)
  --删除表中的数据
  mysql> delete from table where id=?[or name=? (and name=?)];
  --删除表
  mysql> drop table;
  --删除数据库
  mysql> drop database;
  索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
  注:索引不是万能的!索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止 mysql在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。另外,索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
  从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但mysql把同一个数据表里的索引总数限制为16个。
  1. InnoDB数据表的索引
  与MyISAM数据表相比,在 InnoDB数据表上,索引对InnoDB数据表的重要性要在得多。在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。"数据行级锁定"的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT...LOCK IN SHARE MODE、SELECT...FOR UPDATE命令以及INSERT、UPDATE和DELETE命令。
  出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。
  2. 限制
  如果WEHERE子句的查询条件里有不等号(WHERE coloum != ...),mysql将无法使用索引。
  类似地,如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = ...),mysql也将无法使用索引。
  在JOIN操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引。
  如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,mysql 只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE 'abc%',mysql将使用索引;如果查询条件是LIKE '%abc',mysql将不使用索引。
  在ORDER BY操作中,mysql只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快ORDER BY方面也没什么作用)
  如果某个数据列里包含许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含的净是些诸如"0/1"或"Y/N"等值,就没有必要为它创建一个索引。
  普通索引、唯一索引和主索引
  1. 普通索引
  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = ...)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
  2. 唯一索引
  普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个"员工个人资料"数据表里可能出现两次或更多次。
  如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了mysql对这个索引的管理工作,这个索引也因此而变得更有效率;二是 mysql会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,mysql将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
  3. 主索引
  在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的"主索引"。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。
  4. 外键索引
  如果为某个外键字段定义了一个外键约束条件,mysql就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。
  5. 复合索引
  索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。这种索引的特点是mysql可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A, B, C)可以当做A或(A, B)的索引来使用,但不能当做B、C或(B, C)的索引来使用。
  6. 索引的长度
  在为CHAR和VARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个字段所允许的最大字符个数)。这么做的好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。在绝大多数应用里,数据库中的字符串数据大都以各种各样的名字为主,把索引的长度设置为10~15个字符已经足以把搜索范围缩小到很少的几条数据记录了。
  在为BLOB和TEXT类型的数据列创建索引时,必须对索引的长度做出限制;mysql所允许的最大索引jlkjljkjlj全文索引
  文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对mysql来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
  这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,mysql将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:
  ALTER TABLE tablename ADD FULLTEXT(column1, column2)
  有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:
  SELECT * FROM tablename
  WHERE MATCH(column1, column2) AGAINST('word1', 'word2', 'word3')
  上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。
  注解:InnoDB数据表不支持全文索引。
  查询和索引的优化
  只有当数据库里已经有了足够多的测试数据时,它的性能测试结果才有实际参考价值。如果在测试数据库里只有几百条数据记录,它们往往在执行完第一条查询命令之后就被全部加载到内存里,这将使后续的查询命令都执行得非常快--不管有没有使用索引。只有当数据库里的记录超过了1000条、数据总量也超过了mysql服务器上的内存总量时,数据库的性能测试结果才有意义。
  在不确定应该在哪些数据列上创建索引的时候,人们从EXPLAIN SELECT命令那里往往可以获得一些帮助。这其实只是简单地给一条普通的SELECT命令加一个EXPLAIN关键字作为前缀而已。有了这个关键字,mysql将不是去执行那条SELECT命令,而是去对它进行分析。mysql将以表格的形式把查询的执行过程和用到的索引(如果有的话)等信息列出来。
  在EXPLAIN命令的输出结果里,第1列是从数据库读取的数据表的名字,它们按被读取的先后顺序排列。type列指定了本数据表与其它数据表之间的关联关系(JOIN)。在各种类型的关联关系当中,效率最高的是system,然后依次是const、eq_ref、ref、range、index和All(All的意思是:对应于上一级数据表里的每一条记录,这个数据表里的所有记录都必须被读取一遍--这种情况往往可以用一索引来避免)。
  possible_keys数据列给出了mysql在搜索数据记录时可选用的各个索引。key数据列是mysql实际选用的索引,这个索引按字节计算的长度在key_len数据列里给出。比如说,对于一个INTEGER数据列的索引,这个字节长度将是4。如果用到了复合索引,在key_len数据列里还可以看到mysql具体使用了它的哪些部分。作为一般规律,key_len数据列里的值越小越好(意思是更快)。
  ref数据列给出了关联关系中另一个数据表里的数据列的名字。row数据列是mysql在执行这个查询时预计会从这个数据表里读出的数据行的个数。row数据列里的所有数字的乘积可以让我们大致了解这个查询需要处理多少组合。
  最后,extra数据列提供了与JOIN操作有关的更多信息,比如说,如果mysql在执行这个查询时必须创建一个临时数据表,就会在extra列看到using temporary字样
安装mysql时候的注意事项
  1、如果您是用mysql+Apache,使用的又是FreeBSD网路操作系统的话,安装时候你应按注意到FreeBSD的版本问题,在FreeBSD的3.0以下版本来说。mysql Source内含的MIT-pthread运行是正常的,但在这版本以上,你必须使用native threads,也就是加入一个with-named-thread-libs=-lc_r的选项。
  2、如果您在COMPILE过程中出了问题,请先检查你的gcc版本是否在2.81版本以上,gmake版本是否在3.75以上。
  3、如果不是版本的问题,那可能是你的内存不足,请使用./configure -- with-low-memory来加入。
  4、如果您要重新做你的configure,那么你可以键入rm config.cache和make clean来清除记录。
  5、我们一般把mysql安装在/usr/local目录下,这是缺省值,您也可以按照你的需要设定你所安装的目录。
初学mysql哪些需要你知道
  一、连接mysql
  格式: mysql -h主机地址 -u用户名 -p用户密码
  1、例1:连接到本机上的mysql
  首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好mysql,超级用户root是没有密码的,故直接回车即可进入到mysql中了,mysql的提示符是:mysql>
  2、例2:连接到远程主机上的mysql。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
  mysql -h110.110.110.110 -uroot -pabcd123
  (注:u与root可以不用加空格,其它也一样)
  3、退出mysql命令: exit (回车)
  二、修改密码
  格式:mysqladmin -u用户名 -p旧密码 password 新密码
  1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令
  mysqladmin -uroot -password ab12
  注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
  2、例2:再将root的密码改为djg345。
  mysqladmin -uroot -pab12 password djg345
  三、增加新用户
  (注意:和上面不同,下面的因为是mysql环境中的命令,所以后面都带一个分号作为命令结束符)
  格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”
  例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
  grant select,insert,update,delete on *.* to test1@“%” Identified by “abc”;
  但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。
  例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即mysql数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过mysql主机上的web页来访问了。
  grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”;
  如果你不想test2有密码,可以再打一个命令将密码消掉。
  grant select,insert,update,delete on mydb.* to test2@localhost identified by “”;
  下面来看看mysql中有关数据库方面的操作。注意:必须首先登录到mysql中,以下操作都是在mysql的提示符下进行的,而且每个命令以分号结束。
  四、操作技巧
  1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
  2、你可以使用光标上下键调出以前的命令。但以前我用过的一个mysql旧版本不支持。我现在用的是mysql-3.23.27-beta-win。
  五、显示命令
  1、显示数据库列表。
  show databases;
  刚开始时才两个数据库:mysql和test。mysql库很重要它里面有mysql的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
  2、显示库中的数据表:
  use mysql; //打开库,学过FOXBASE的一定不会陌生吧
  show tables;
  3、显示数据表的结构:
  describe 表名;
  4、建库:
  create database 库名;
  5、建表:
  use 库名;
  create table 表名 (字段设定列表);
  6、删库和删表:
  drop database 库名;
  drop table 表名;
  7、将表中记录清空:
  delete from 表名;
  8、显示表中的记录:
  select * from 表名;
  六、一个建库和建表以及插入数据的实例
  drop database if exists school; //如果存在SCHOOL则删除
  create database school; //建立库SCHOOL
  use school; //打开库SCHOOL
  create table teacher //建立表TEACHER
  (
  id int(3) auto_increment not null primary key,
  name char(10) not null,
  address varchar(50) default ‘深圳',
  year date
  ); //建表结束
  //以下为插入字段
  insert into teacher values('','glchengang',’深圳一中‘,'1976-10-10');
  insert into teacher values('','jack',’深圳一中‘,'1975-12-23');
  注:在建表中:
  (1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key。
  (2)将NAME设为长度为10的字符字段。
  (3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
  (4)将YEAR设为日期字段。
  如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:下,并在DOS状态进入目录mysqlbin,然后键入以下命令:
  mysql -uroot -p密码 < c:school.sql
  如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。
  七、将文本数据转到数据库中
  1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用n来代替.
  例:
  3 rose 深圳二中 1976-10-10
  4 mike 深圳一中 1975-12-23
  2、数据传入命令 load data local infile “文件名” into table 表名;
  注意:你最好将文件复制到mysqlbin目录下,并且要先用use命令打表所在的库 。
  八、备份数据库:(命令在DOS的mysqlbin目录下执行)
  mysqldump --opt school>school.bbb
  注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
相关词
数据库文件系统光驱净水器滤芯php论坛cms网页模板
aspapacheNginx网站perl软件服务器数据库管理
更多结果...