TextRange对象和selection对象实例

IE提供了Selection对象和TextRange对象用于实现对被选择内容进行修改以及在指定区域中进行查找.

selection对象是document对象的一个子对象,改对象对应于用户在页面中所选择的区域.selection对象的属性和方法定义如下:
     type属性: 该属性为只读属性.当被选择区域包含文本或其他内容时,type属性返回值为"Text";当被选择区域为空时,type属性返回值为"None".
     clear()方法: 该方法清除所选择区域的内容.
     empty()方法: 该方法使selection对象为空,即取消选择,并将页面滚动到最顶部.
     createRange()方法: 该方法基于用户当前所选择的区域创建TextRange对象,以对被选择区域进行进一步处理.

TextRange对象对应于页面中一个矩形区域,该对象可以用于处理页面中的任何内容.TextRange对象可以通过<body>,<button>,<textarea>,<input type="text">等元素的CreateTextRange()方法来创建,这样创建的区域起始于元素的起始标记.
例如:
           var myTextRange = document.body.createTextRange()
创建的TextRange对象myTextRange对应的区域包含<body>和</body>标记之间的所有内容.
TextRange对象也可以通过selection对象的CreateRange()方法基于当前被选择区域创建.
例如:
         var myTextRange = document.selection.createRange()
基于用户所选择的区域创建TextRange对象.

TextRange对象的属性和方法定义如下:
     htmlText属性: 对应于TextRange对象区域内的文本和HTML代码.该属性可读可写,可以通过对该属性赋新值来改变TextRange区域内的HTML代码内容.
     Text属性: 对应于TextRange对象区域内的文本内容(忽略其中的HTML代码).该属性同样是可读可写的,可以通过Text属性赋新值的方法来改变TextRange区域内的文本内容.同htmlText属性不同的是,text属性不包含区域内的HTML代码.
例如:
          对于代码
                 <body>
                       This is the <strong> TextRange </strong> example;
                 </body>
                 <script>
                       var myTextRange = document.body.createTextRange();
                 </script>
          所创建的TextRange对象,其中htmlText属性值为: 
          This is the <strong> TextRange </strong> example;
          而text属性值为:
          This is the TextRange example;
     expand()方法: 该方法用于扩展TextRange区域.扩展可以基于字符(character),单词(word),句子(sentence)或整个可编辑文本文本快(entire editable text range).当基于单词,句子或整个可编辑文本块进行扩展时,扩展后的TextRange对象将包含完整的单词,句子或者整个可编辑文本块.
例如:
          如果当前TextRange对象对应的区域为:    This is the TextRange example;    中灰色部分,即字符TextRa所对应部分,当使用expand()方法对该TextRange对象基于单词扩展:    myTextRange.expand("word");   扩展后,其所对应区域包含完整的单词"TextRange".  This is the TextRange example;
     findText()方法: 该函数在TextRange对象对应区域中查找指定的文本内容,如果找到,则将找到的内容所在的区域赋于该TextRange对象.
例如:
            myTextRange.findText("example")
将在TextRange对象myTextRange对应的区域中查找字符串"example"
      scrollintoView()方法: 该方法使浏览器窗口滚动,是TextRange对象对应的区域可见,并处于浏览器窗口的最顶端.
      select()方法: 使TextRange对象对应区域内容选中(处于高亮状态);并自动调用scrollintoView()方法,是TextRange对象对应区域可见,并位于浏览器顶端.
      movie()方法: 该方法将TextRange对象对应区域向后移动若干个基本单位量.基本单位量可以是字符(character),单词(word),句子(sentence).使用该方法对TextRange对象区域进行移动后,TextRange对象对应区域的起点和终点将重合.
例如:
            myTextRange("word",5)
将myTextRange区域起点向后移动5个单词,移动后,终点与起点重合在起点的新位置处.
       moveEnd()方法: 将TextRange对象对应区域的终点移动若干个基本单位量,基本单位量同move()方法中相同,可取字符(character),单词(word)或句子(sentence).
例如:
            myTextRange.moveEnd("word",3)
将myTextRange区域的终点向后移动3个单词.
       movestart()方法: 将TextRange对象对应区域的起点移动若干个基本单位量.基本单位可取值同moveEnd()方法相同.

php 批量删除

前几天为了搞一个批量删除,把百度都快搜索爆了,哈哈….
    php的批量删除有3个部分:1.是全选的js代码;2.是php删除代码我不是用类写的,大家一看就能看懂;3.是页面代码。
js部分用全选的:function All(e, itemName)
{
var aa = document.getElementsByName(itemName);
for (var i=0; i<aa.length; i++)
   aa[i].checked = e.checked; //得到那个总控的复选框的选中状态
}
function Item(e, allName)
{
var all = document.getElementsByName(allName)[0];
if(!e.checked) all.checked = false;
else
{
    var aa = document.getElementsByName(e.name);
    for (var i=0; i<aa.length; i++)
     if(!aa[i].checked) return;
    all.checked = true;
}
}

php删除代码:
<?php
//连接数据库
    include("conn.php");
//删除
    //传来的值
    $mm = $_POST["mm"];
    $id =implode(",",$mm);
    $sql = "delete from leaves where id in(".$id.")";
    //echo $sql;
    $result=mysql_query($sql);
    echo $result?"删除成功":"删除失败";
?>
页面部分代码:
<table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td height="20" bgcolor="#E5E6E7" class="114">
            下面这句代码是注意看哦!
<input type="checkbox" name="mm[]" value="<?php echo $id; ?>" onclick="Item(this, ‘mmAll’)">
            <span class="block12">
              网友
              于
              <?php echo $time; ?>       
               </span>
            </td>
            <td bgcolor="#E5E6E7" align="right" width="10%" nowrap><a href="admin_shanping_2.php?id=<?php echo $id; ?>" onclick="return confirm(‘您确定删除此项吗?’)" >删除</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <span class="block12">IP:<?php echo $Ip;?>&nbsp;</span></td>
          </tr>
          <tr>
            <td bgcolor="#FFFFFF" colspan=2>
              <table width="100%" border="0" cellspacing="1" cellpadding="6" bgcolor="#D8D7D6">
                <tr>
                  <td bgcolor="#FFFFFF" class="l14"><?php $content=htmlspecialchars($content,ENT_QUOTES); echo $content; ?></td>
                </tr>
              </table>
            </td>
          </tr>
   
        </table>
   
        <?php
        }
        ?>
        </td>
</tr>
<tr>
    <td align="center"> <input type="checkbox" name="mmAll" onclick="All(this, ‘mm[]‘)">全选 &nbsp;&nbsp;
    <input name="Submit" type="submit" value="删除">&nbsp;&nbsp;&nbsp;
</tr>
</table>

 

list each

each() 经常和 list() 结合使用来遍历数组,例如:
用 each() 遍历数组
[Copy to clipboard]
PHP CODE:
<?php
$fruit = array(‘a’ => ‘apple’, ‘b’ => ‘banana’, ‘c’ => ‘cranberry’);
reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>
以上的显示为(浏览器里查看源码)
a => apple
b => banana
c => cranberry
在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。
如果要再用 each 遍历数组,必须使用 reset()。 这也是代码里用reset的原因,让指针回到初始位置。
希望对你有帮助。

mysql 数据库设计

我们要把现实世界中的各种信息转换成计算机能理解的东西,这些转换后的信息就形成了数据。例如,某人的出生日期是“1987年5月23日”,他的身高是170厘米,等等。数据不仅包括数字、字母、文字和其他特殊字符组成的文本形式的数据,而且还包括图形、图像、动画、影像、声音等多媒体数据。但使用最多、最基本的仍然是文本数据。

    1. MySQL的数据类型

    在MySQL中有如下几种数据类型:

    (1)数值型

    数值是诸如32 或153.4 这样的值。MySQL 支持科学表示法,科学表示法由整数或浮点数后跟“e”或“E”、一个符号(“+”或“-”)和一个整数指数来表示。1.24E+12 和23.47e-1 都是合法的科学表示法表示的数。而1.24E12 不是合法的,因为指数前的符号未给出。

    浮点数由整数部分、一个小数点和小数部分组成。整数部分和小数部分可以分别为空,但不能同时为空。

    数值前可放一个负号“-”以表示负值。

    (2)字符(串)型

    字符型(也叫字符串型,简称串)是诸如“Hello, world!”或“一个馒头引起的血案”这样的值,或者是电话号码87398413这样的值。既可用单引号也可用双引号将串值括起来。

初学者往往分不清数值87398143和字符串87398143的区别。都是数字啊,怎么一个要用数值型,一个要用字符型呢?关键就在于:数值型的87398143是要参与计算的,比如它是金融中的一个货款总额;而字符型的87398143是不参与计算的,只是表示电话号码,这样的还有街道号码、门牌号码等等,它们都不参与计算。

    (3)日期和时间型

    日期和时间是一些诸如“2006-07-12”或“12:30:43”这样的值。MySQL还支持日期/时间的组合,如“2006-07-12 12:30:43”。

    (4)NULL值

    NULL表示未知值。比如填写表格中通讯地址不清楚留空不填写,这就是NULL值。

    我们用Create Table语句创建一个表(参看前面的章节),这个表中包含列的定义。例如我们在前面创建了一个joke表,这个表中有content和writer两个列:

CREATE TABLE

content varchar(20) NOT NULL,

writer varchar(10) NULL

   定义一个列的语法如下:

col_name col_typy [col_attributes] [general_attributes]

其中列名由col_name 给出。列名可最多包含64个字符,字符包括字母、数字、下划线及美元符号。列名可以名字中合法的任何符号(包括数字)开头。但列名不能完全由数字组成,因为那样可能使其与数据分不开。MySQL保留诸如SELECT、DELETE和CREATE这样的词,这些词不能用做列名,但是函数名(如POS 和MIN)是可以使用的。

    列类型col_type表示列可存储的特定值。列类型说明符还能表示存放在列中的值的最大长度。对于某些类型,可用一个数值明确地说明其长度。而另外一些值,其长度由类型名蕴含。例如,CHAR(10) 明确指定了10个字符的长度,而TINYBLOB值隐含最大长度为255个字符。有的类型说明符允许指定最大的显示宽度(即显示值时使用多少个字符)。浮点类型允许指定小数位数,所以能控制浮点数的精度值为多少。

    可以在列类型之后指定可选的类型说明属性,以及指定更多的常见属性。属性起修饰类型的作用,并更改其处理列值的方式,属性有以下类型:

    (1)专用属性用于指定列。例如,UNSIGNED 属性只针对整型,而BINARY属性只用于CHAR 和VARCHAR。

    (2)通用属性除少数列之外可用于任意列。可以指定NULL 或NOT NULL 以表示某个列是否能够存放NULL。还可以用DEFAULT,def_value 来表示在创建一个新行但未明确给出该列的值时,该列可赋予值def_value。def_value 必须为一个常量;它不能是表达式,也不能引用其他列。不能对BLOB 或TEXT 列指定缺省值。

    如果想给出多个列的专用属性,可按任意顺序指定它们,只要它们跟在列类型之后、通用属性之前即可。类似地,如果需要给出多个通用属性,也可按任意顺序给出它们,只要将它们放在列类型和可能给出的列专用属性之后即可。

    2. MySQL的列(字段)类型

    数据库中的每个表都是由一个或多个列(字段)构成的。在用CREATE TABLE语句创建一个表时,要为每列(字段)指定一个类型。列(字段)的类型比数据类型更为细化,它精确地描述了给定表列(字段)可能包含的值的种类,如是否带小数、是否文字很多。

    2.1数值列类型

    MySQL有整数和浮点数值的列类型,如表1所示。整数列类型可以有符号也可无符号。有一种特殊的属性允许整数列值自动生成,这对需要唯一序列或标识号的应用系统来说是非常有用的。

类型

说明

TINYINT

非常小的整数

SMALLINT

较小整数

MEDIUMINT

中等大小整数

INT

标准整数

BIGINT

较大整数

FLOAT

单精度浮点数

DOUBLE

双精度浮点数

DECIMAL

一个串的浮点数

表1:数值列类型

    每种数值类型的名称和取值范围如表2所示。

类型说明

取值范围

TINYINT[(M)]

有符号值:-128 到127(- 27 到27 – 1)

无符号值:0到255(0 到28 – 1)

SMALLINT[(M)]

有符号值:-32768 到32767(- 215 到215 – 1)

无符号值:0到65535(0 到21 6 – 1)

MEDIUMINT[(M)]

有符号值:-8388608 到8388607(- 22 3 到22 3 – 1 )

无符号值:0到16777215(0 到22 4 – 1)

INT[(M)]

有符号值:-2147683648 到2147683647(- 231 到231- 1)

无符号值:0到4294967295(0 到232 – 1)

BIGINT[(M)]

有符号值:-9223372036854775808 到9223373036854775807(- 263到263-1)

无符号值:0到18446744073709551615(0到264 – 1)

FLOAT[(M, D)]

最小非零值:±1.175494351E – 38

DOUBLE[(M,D)]

最小非零值:±2.2250738585072014E – 308

DECIMAL (M, D)

可变;其值的范围依赖于M 和D

表2:数值列类型的取值范围

    各种类型值所需的存储量如表3所示。

类型说明

存储需求

TINYINT[(M)]

1字节

SMALLINT[(M)]

2字节

MEDIUMINT[(M)]

3字节

INT[(M)]

4字节

BIGINT[(M)]

8字节

FLOAT[(M, D)]

4字节

DOUBLE[(M, D)]

8字节

DECIMAL (M, D)

M字节(MySQL  3.23 )

表3:数值列类型的存储需求

MySQL提供了五种整型: TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。INT为INTEGER的缩写。这些类型在可表示的取值范围上是不同的。整数列可定义为UNSIGNED从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大。

    MySQL 提供三种浮点类型: FLOAT、DOUBLE和DECIMAL。与整型不同,浮点类型不能是UNSIGNED的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。

    在选择了某种数值类型时,应该考虑所要表示的值的范围,只需选择能覆盖要取值的范围的最小类型即可。选择较大类型会对空间造成浪费,使表不必要地增大,处理起来没有选择较小类型那样有效。对于整型值,如果数据取值范围较小,如人员年龄或兄弟姐妹数,则TINYINT最合适。MEDIUMINT能够表示数百万的值并且可用于更多类型的值,但存储代价较大。BIGINT在全部整型中取值范围最大,而且需要的存储空间是表示范围次大的整型INT类型的两倍,因此只在确实需要时才用。对于浮点值,DOUBLE占用FLOAT的两倍空间。除非特别需要高精度或范围极大的值,一般应使用只用一半存储代价的FLOAT型来表示数据。

    在定义整型列时,可以指定可选的显示尺寸M。如果这样,M应该是一个1 到255的整数。它表示用来显示列中值的字符数。例如,MEDIUMINT(4)指定了一个具有4个字符显示宽度的MEDIUMINT列。如果定义了一个没有明确宽度的整数列,将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度。如果某个特定值的可打印表示需要不止M个字符,则显示完全的值;不会将值截断以适合M个字符。

    对每种浮点类型,可指定一个最大的显示尺寸M 和小数位数D。M 的值应该取1 到255。D的值可为0 到3 0,但是不应大于M – 2(如果熟悉ODBC 术语,就会知道M 和D 对应于ODBC 概念的“精度”和“小数点位数”)。M和D对FLOAT和DOUBLE 都是可选的,但对于DECIMAL是必须的。在选项M 和D时,如果省略了它们,则使用缺省值。

    2.2字符串列类型

    MySQL提供了几种存放字符数据的串类型,其类型如下:

类型名

说明

CHAR

定长字符串

VARCHAR

可变长字符串

TINYBLOB

非常小的BLOB(二进制大对象)

BLOB

小BLOB

MEDIUMBLOB

中等的BLOB

LONGBLOB

大BLOB

TINYTEXT

非常小的文本串

TEXT

小文本串

MEDIUMTEXT

中等文本串

LONGTEXT

大文本串

ENUM

枚举;列可赋予某个枚举成员

SET

集合;列可赋予多个集合成员

表4:字符串列类型

    下表给出了MySQL 定义串值列的类型,以及每种类型的最大尺寸和存储需求。对于可变长的列类型,各行的值所占的存储量是不同的,这取决于实际存放在列中的值的长度。这个长度在表中用L 表示。

类型说明

最大尺寸

存储需求

CHAR( M)

M 字节

M 字节

VARCHAR(M)

M 字节

L + 1字节

TINYBLOB, TINYTEXT

28- 1字节

L + 1字节

BLOB, TEXT

216 – 1 字节

L + 2字节

MEDIUMBLOB, MEDIUMTEXT

224- 1字节

L + 3字节

LONGBLOB, LONGTEXT

232- 1字节

L + 4字节

ENUM(“value1”, “value2”, …)

65535 个成员

1 或2字节

SET (“value1”, “value2”, …)

64个成员

1、2、3、4 或8字节

表5:串列类型最大尺寸及存储需求

    L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL 通过存储值的内容及其长度来处理可变长度的值。这些额外的字节是无符号整数。请注意,可变长类型的最大长度、此类型所需的额外字节数以及占用相同字节数的无符号整数之间的对应关系。例如,MEDIUMBLOB 值可能最多224 – 1字节长并需要3 个字节记录其结果。3 个字节的整数类型MEDIUMINT 的最大无符号值为224 – 1。这并非偶然。

    2.3日期时间列类型

    MySQL 提供了几种时间值的列类型,它们分别是: DATE、DATETIME、TIME、TIMESTAMP和YEAR。下表给出了MySQL 为定义存储日期和时间值所提供的这些类型,并给出了每种类型的合法取值范围。

类型名

说明

DATE

“YYYY-MM-DD”格式表示的日期值

TIME

“hh:mm:ss”格式表示的时间值

DATETIME

“YYYY-MM-DD hh:mm:ss”格式

TIMESTAMP

“YYYYMMDDhhmmss”格式表示的时间戳值

YEAR

“YYYY”格式的年份值

表6:日期时间列类型

类型名

取值范围

存储需求

DATE

“1000-01-01”到“9999-12-31”

3字节

TIME

“-838:59:59”到“838:59:59”

3字节

DATETIME

“1000-01-01 00:00:00” 到“9999-12-31 23:59:59”

8字节

TIMESTAMP

19700101000000 到2037 年的某个时刻

4字节

YEAR

1901 到2155

1字节

表7: 日前时间列类型的取值范围和存储需求

    下面举个例子:

CREATE TABLE student

(

Name varchar(20) NOT NULL,

Chinese TINYINT(3),

Maths TINYINT(3),

English TINYINT(3),

Birthday DATE

)

    这个例子创建一个student表,这个表中有name字段,字符类型列,不允许NULL(空值)。有Chinese、Maths和English三个整数类型列。还有个Birthday日期类型列。

表 A

数据类型

描述

字节

推荐使用

SMALLINT

整数,从-32000到 +32000范围

2

存储相对比较小的整数。

比如: 年纪,数量

INT

整数,从-2000000000 到 +2000000000 范围

4

存储中等整数

例如: 距离

BIGINT

不能用SMALLINT 或 INT描述的超大整数。

8

存储超大的整数

例如: 科学/数学数据

FLOAT

单精度浮点型数据

4

存储小数数据

例如:测量,温度

DOUBLE

双精度浮点型数据

8

需要双精度存储的小数数据

例如:科学数据

DECIMAL

用户自定义精度的浮点型数据

变量;取决于精度与长度

以特别高的精度存储小数数据。

例如:货币数额,科学数据

CHAR

固定长度的字符串

特定字符串长度(高达255字符)

存储通常包含预定义字符串的变量

例如: 定期航线,国家或邮编

VARCHAR

具有最大限制的可变长度的字符串

变量; 1 + 实际字符串长度 (高达 255 字符)

存储不同长度的字符串值(高达一个特定的最大限度).

例如:名字,密码,短文标签

TEXT

没有最大长度限制的可变长度的字符串

Variable; 2 +聽 actual string length

存储大型文本数据

例如: 新闻故事,产品描述

BLOB

二进制字符串

变量;2 + 实际字符串长度

存储二进制数据

例如:图片,附件,二进制文档

DATE

以 yyyy-mm-dd格式的日期

3

存储日期

例如:生日,产品满期

TIME

以 hh:mm:ss格式的时间

3

存储时间或时间间隔

例如:报警声,两时间之间的间隔,任务开始/结束时间

DATETIME

以yyyy-mm-ddhh:mm:ss格式结合日期和时间

8

存储包含日期和时间的数据

例如:提醒的人,事件

TIMESTAMP

以yyyy-mm-ddhh:mm:ss格式结合日期和时间

4

记录即时时间

例如:事件提醒器,“最后进入”的时间标记

YEAR

以 yyyy格式的年份

1

存储年份

例如:毕业年,出生年

ENUM

一组数据,用户可从中选择其中一个

1或 2个字节

存储字符属性,只能从中选择之一

例如:布尔量选择,如性别

SET

一组数据,用户可从中选择其中0,1或更多。

从1到8字节;取决于设置的大小

存储字符属性,可从中选择多个字符的联合。

例如:多选项选择,比如业余爱好和兴趣。

MYSQL中EXPLAIN–表查询优化

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:

如:explain select surname,first_name form a,b where a.id=b.id

EXPLAIN列的解释:

  • table:显示这一行的数据是关于哪张表的
  • type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
  • possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
  • key:实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
  • key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
  • ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
  • rows:MYSQL认为必须检查的用来返回请求数据的行数
  • Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

extra列返回的描述的意义

  • Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
  • Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
  • Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
  • Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
  • Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
  • Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
  • Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
  • system 表只有一行:system表。这是const连接类型的特殊情况
  • const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
  • eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
  • ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
  • range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
  • index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
  • ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

Mysql数据库优化技术 — 索引篇

(七)表的优化
1. 选择合适的数据引擎
MyISAM:适用于大量的读操作的表
InnoDB:适用于大量的写读作的表

2.选择合适的列类型
使用 SELECT * FROM TB_TEST PROCEDURE ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议

3.对于不保存NULL值的列使用NOT NULL,这对你想索引的列尤其重要
4.建立合适的索引
5.使用定长字段,速度比变长要快

(八)建立索引原则
1.合理使用索引
一个Table在一次query中只能使用一个索引,使用EXPLAIN语句来检验优化程序的操作情况
使用analyze帮助优化程序对索引的使用效果做出更准确的预测
2.索引应该创建在搜索、排序、归组等操作所涉及的数据列上

3.尽量将索引建立在重复数据少的数据列中,唯一所以最好
例如:生日列,可以建立索引,但性别列不要建立索引

4.尽量对比较短的值进行索引
降低磁盘IO操作,索引缓冲区中可以容纳更多的键值,提高命中率
如果对一个长的字符串建立索引,可以指定一个前缀长度
5.合理使用多列索引
如果多个条件经常需要组合起来查询,则要使用多列索引(因为一个表一次查询只能使用一个索引,建立多个单列索引也只能使用一个)

6.充分利用最左前缀
也就是要合理安排多列索引中各列的顺序,将最常用的排在前面

7.不要建立过多的索引
只有经常应用于where,order by,group by中的字段需要建立索引.

8.利用慢查询日志查找出慢查询(log-slow-queries, long_query_time)

(九)充分利用索引
1.尽量比较数据类型相同的数据列

2.尽可能地让索引列在比较表达式中独立, WHERE mycol < 4 / 2 使用索引,而WHERE mycol * 2 < 4不使用

3.尽可能不对查询字段加函数,
如WHERE YEAR(date_col) < 1990改造成WHERE date_col < ’1990-01-01’
WHERE TO_DAYS(date_col) – TO_DAYS(CURDATE()) < cutoff 改造成WHERE date_col < DATE_ADD(CURDATE(), INTERVAL cutoff DAY)

4.在LIKE模式的开头不要使用通配符
5.使用straight join可以强制优化器按照FROM子句的次序来进行联结,可以select straight join,强制所有联结,也可以select * from a straight join b强制两个表的顺序.
6.使用force index强制使用指定的索引.如 select * from song_lib force index(song_name) order by song_name比不用force index效率高
7.尽量避免使用MySQL自动类型转换,否则将不能使用索引.如将int型的num_col用where num_col=‘5’

(十)SQL语句的优化
1.创建合适的统计中间结果表,降低从大表查询数据的几率
2.尽量避免使用子查询,而改用连接的方式.例如:
SELECT a.id, (SELECT MAX(created) FROM posts WHERE author_id = a.id) AS latest_post
FROM authors a
可以改成:
SELECT a.id, MAX(p.created) AS latest_post
FROM authors AS a
INNER JOIN posts p ON (a.id = p.author_id)
GROUP BY a.id

select song_id from song_lib where singer_id in
(select singer_id from singer_lib
where first_char=’A’
) limit 2000改成:
select song_id from song_lib a
inner join singer_lib b on a.singer_id=b.singer_id and first_char=’A’ limit 2000

3.插入判断重复键时,使用ON DUPLICATE KEY UPDATE :
insert into db_action.action_today(user_id,song_id,action_count) values(1,1,1) ON DUPLICATE KEY UPDATE action_count=action_count+1;

4.避免使用游标
游标的运行效率极低,可以通过增加临时表,运用多表查询,多表更新等方式完成任务,不要使用游标.

(十一)使用Explain分析SQL语句使用索引的情况
当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息,借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT,你也能知道优化器是否以一个最佳次序联结表。为了强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。 。
EXPLAIN命令的一般语法是:EXPLAIN <SQL命令> 如:explain select * from a inner join b on a.id=b.id
EXPLAIN的分析结果参数详解:
1.table:这是表的名字。
2.type:连接操作的类型。
system:表中仅有一条记录(实际应用很少只有一条资料的表)
const:表最多有一个匹配行,用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时,
如:select * from song_lib where song_id=2(song_id为表的primary key)
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARY KEY的索引读取一行,
如:select * from song_lib a inner join singer_lib b on a.singer_id=b.singer_id(b的type值为eq_ref)
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARY KEY的索引读取一行
如:select * from song_lib a inner join singer_lib b on a.singer_name=b.singer_name和
select * from singer_lib b where singer_name=‘ccc’ (b的type值为ref,因为b.singer_name是普通索引)
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行,
如:select * from singer_lib where singer_name=‘ccc’ or singer_name is null
index_merge:该联接类型表示使用了索引合并优化方法
Key: 它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len: 索引中被使用部分的长度,以字节计。

3.ref:ref列显示使用哪个列或常数与key一起从表中选择行
4.rows: MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。
5.Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。一般有:
using where:表示使用了where条件
using filesort: 表示使用了文件排序,也就是使用了order by子句,并且没有用到order by 里字段的索引,从而需要
额外的排序开销,所以如果出现using filesort就表示排序的效率很低,需要进行优化,比如采用强制索引
的方法(force index)

网站地址前小图标更改/favicon.ico

favicon.ico制作工具

先用PS制作(随便找张图也可以,最好小图标16*16的)
用ICO图标制作工具按载入图标
调整图标正规大小16*16
保存后上传到网站根目录就可以了(注:图标必须命名为favicon.ico)

假设图片favicon.ico在网站/目录下

需要在HEADER里加入如下代码,
<link rel="shortcut icon" type="image/ico" href="/favicon.ico">