to xuzuning(唠叨) 老大.
讲一下索引怎么用吧,主要是思路.
还有在使用索引的时候,是不是要选做什么?书上都没找到这方面
的东西了,谢谢了:)

解决方案 »

  1.   

    你这里面如果是我的个人做法的话应该至少有下面几个表:
    员工表
    员工代号(最好用一个id,这样员工复名时,不会影响到单子查询,当然也可以用其它的不重复的东东),员工姓名,员工部门,员工的其它信息提单表:单子代号(可以有id,这样避免做假,采用重复的,或者其它的造假等),公司名称(如果把客户做一个表的话用客户代号我喜欢把客户做成一个表,调用 客户代号),项目名称,提交人(用员工信息中的员工代号),制作人(用员工信息中的员工代号),客户人员
    当然还可以把客户做成一个表(客户表),这样增加一个客户,修改一个客户信息时不会影响到其它的表,而且结构比较
    客户代号 客户公司名称,客户的其它信息(主要描述等)
    所以我觉得增加id并不一定会增加复杂度,与维护的开销,但是建立的索引可以提高在上百万条数据时的查询速度以上是个人意见,现丑了,诚心地向各位学习,祝大家端午节快乐!工作开心!
      

  2.   

    这是个理解问题吧。
    通常作为主键的id(这样命名只是习惯而已)是用作对该记录的唯一标识的
    既然有其他内容可做唯一标识,那么也就不必要那个id了。
    楼主的“是否需要增加三个字段标识业务,技术和客服的ID”显然是多余的,对应这些ID与实际内容的关系必然导致维护上的开销增大对于索引的使用,手册上的这段并不难理解。只需在书写sql指令时注意到就可以了。10.4 MySQL索引的使用
    索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。 所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。字符串是自动地压缩前缀和结尾空间。见7.27 CREATE INDEX句法。 索引用于: 快速找出匹配一个WHERE子句的行。 
    当执行联结时,从其他表检索行。 
    对特定的索引列找出MAX()或MIN()值。 
    如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。 
    在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。 
    假定你发出下列SELECT语句: mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。 如果表有一个多列索引,任何最左面的索引前缀能被优化器使用以找出行。例如,如果你有一个3行列索引(col1,col2,col3),你已经索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。 如果列不构成索引的最左面前缀,MySQL不能使用一个部分的索引。假定你下面显示的SELECT语句: mysql> SELECT * FROM tbl_name WHERE col1=val1;
    mysql> SELECT * FROM tbl_name WHERE col2=val2;
    mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;如果一个索引存在于(col1、col2、col3)上,只有上面显示的第一个查询使用索引。第二个和第三个查询确实包含索引的列,但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前缀。 如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。例如,下列SELECT语句使用索引: mysql> select * from tbl_name where key_col LIKE "Patrick%";
    mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";在第一条语句中,只考虑有"Patrick" <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。 下列SELECT语句将不使用索引: mysql> select * from tbl_name where key_col LIKE "%Patrick%";
    mysql> select * from tbl_name where key_col LIKE other_col;在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。 如果 column_name 是一个索引,使用column_name IS NULL的搜索将使用索引。 MySQL通常使用找出最少数量的行的索引。一个索引被用于你与下列操作符作比较的列:=、>、>=、<、<=、BETWEEN和一个有一个非通配符前缀象'something%'的LIKE的列。 任何不跨越的在WHERE子句的所有AND层次的索引不用来优化询问。 下列WHERE子句使用索引:... WHERE index_part1=1 AND index_part2=2
    ... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 */
    ... WHERE index_part1='hello' AND index_part_3=5
              /* optimized like "index_part1='hello'" */这些WHERE子句不使用索引: ... WHERE index_part2=1 AND index_part3=2  /* index_part_1 is not used */
    ... WHERE index=1 OR A=10                  /* No index */
    ... WHERE index_part1=1 OR index_part2=10  /* No index spans all rows */
      

  3.   

    既然有其他内容可做唯一标识,那么也就不必要那个id了。这句话我没太理解,
    如果将业务,技术和客服的名字索引后,它们就是唯一标识了?不是吧老大说的应该是这个意思,比如说我们在csdn上不是有个用户名吗?那是唯一的,不会重复,可以用来标识,
    不过我觉得一个提单,一般提单号不是数字的吗?所以用数字id来比较好一点,其它的如果有了标识,也就是数据库中的主键,当然没有必要再用id来主标识了
      

  4.   

    “如果将业务,技术和客服的名字索引后,它们就是唯一标识了?不是吧”
    当然不是,唯一标识与索引并无直接关系检索一个字符串与检索一个数字,效果是一样的。数据库系统都是当作字符串处理的。通常在建表时都会设一个数字化的id,用来唯一的表示这条记录。
    如果你在查询时使用了这个id的话,那么就不存在“增加三个字段标识业务,技术和客服的ID”