1. 磁盘搜索。需要花时间从磁盘上找到一个数据,用在现代磁盘的平均时间通常小于10ms,因此理论上我们能够每秒大约搜索1000次。这个时间在新磁盘上提高不大并且很难为一个表进行优化。优化它的方法是将数据分布在多个磁盘上。
  2. 磁盘读/写。当磁盘放入正确位置后,我们需要从中读取数据。对于现代的磁盘,一个磁盘至少传输10-20Mb/s的吞吐。这比搜索要容易优化,因为你能从多个磁盘并行地读。
  3. CPU周期。我们将数据读入内存后,需要对它进行处理以获得我们需要的结果。表相对于内存较小是最常见的限制因素。但是对于小表,速度通常不成问题。
  4. 内存带宽。当CPU需要的数据超出CPU缓存时,主缓存带宽就成为内存的一个瓶颈

MySQL中如何获取下一条插入的自增ID 或 刚刚插入的id

要立刻获得刚插入记录的id,该表必须有一个为一个AUTO_INCREMENT列生成的ID

$sql_addinfo ” insert into contact_info_group set contact_group_id=”,contact_id=” ” ;
mysql_query ( $sql_addinfo ) ;
echo mysql_insert_id () ;

mysql_insert_id – 取得上一步 INSERT 操作产生的 ID

int mysql_insert_id ( [resource link_identifier])
mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。

如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id() 返回 0。如果需要保存该值以后使用,要确保在产生了值的查询之后立即调用 mysql_insert_id()。

注: MySQL 中的 SQL 函数 LAST_INSERT_ID() 总是保存着最新产生的 AUTO_INCREMENT 值,并且不会在查询语句之间被重置。
警告

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

具体使用如下语句:mysql_query(”SELECT LAST_INSERT_ID()”);

PS: 在插入数据时候可以这样写insert into xxx (col_a, col_b) values (11,22);select LAST_INSERT_ID()这样不就可以取到最近生成的ID了吗.

常常需要在编程的时候获取当前表的下一个自增的ID值,因为表可能被删除之后造成最大的Max(ID) + 1并不是下一条ID的值,所以需要使用其他办法。通过查询Mysql的文档,会发现Mysql里面有一个函数叫做getLastInsertID,用来获取最后插入的表的ID值,但是对获取下一条插入的自增ID并没有太多帮助。

1. 方法1
插入一条测试记录,然后删除掉,获取ID。不再赘述。

2. 方法2
利用Mysql自带的一个函数语句 “SHOW TABLE STATUS” ,可以获取当前数据库里的所有表的属性等信息,通常用来做数据库的优化和维护。如果需要指定某一张表的话,可以通过两种方法指定。
一种是网上给出来的:
show table status like ‘TableName
另外就是常见的where语句
show table status where Name =’ TableName

得到的结果集里面有一列AUTO_INCREMENT,是一个Int值变量,获取之后就是下一个要插入的ID了。

//查看表“测试”的状态

$r = mysql_query(“show table status where name=’ceshi'”);
$r_h = mysql_fetch_assoc($r);
//获得下一条信息的id号
var_dump($r_h[‘Auto_increment’]);

安装.msi文件到最后一步并没有像以前一样在finish界面的上方有个勾选的地方(是否进行配置向导),而是finish后就没有然后了,什么提示都没有!!!

解决方法如下:

  1. mysql的目录下也没有出现my.ini文件而是出现了一个,default.ini文件,这是默认的配置文件,这里将default.ini复制一份到改名为my.ini并将如下代码写入
    basedir=D:/wamp/mysql
    datadir=D:/wamp/mysql/data
    port=3306
  2. 建立data空文件夹
  3. 执行mysqld –initialize-insecure –user=mysql,官方文档说明,使用-initialize生成随机密码,使用-initialize-insecure是生成空密码。默认帐号root,后面的-user=mysql不更改
  4. 执行完mysqld –initialize-insecure –user=mysql命令后没有任何提示,直接执行net start mysql,成功开启

 

转自:http://www.php100.com/html/webkaifa/database/Mysql/2010/0409/4279.html

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。

在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );   我们随机向里面插入了10000条记录,其中有一条:5555, admin。

在查找username=”admin”的记录 SELECT * FROM mytable WHERE username=’admin’;时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

MySQL索引类型包括:

(1)普通索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

◆创建索引

CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

◆修改表结构

ALTER mytable ADD INDEX [indexName] ON (username(length))

◆创建表的时候直接指定

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   INDEX [indexName] (username(length))   );

◆删除索引的语法:

DROP INDEX [indexName] ON mytable;

(2)唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

◆创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

◆修改表结构

ALTER mytable ADD UNIQUE [indexName] ON (username(length))

◆创建表的时候直接指定

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   UNIQUE [indexName] (username(length))   );

(3)主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)   );  当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

(4)组合索引

为了形象地对比单列索引和组合索引,为表添加多个字段:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   city VARCHAR(50) NOT NULL,   age INT NOT NULL  );  为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

usernname,city,age   usernname,city   usernname  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:

SELECT * FROM mytable WHREE username=”admin” AND city=”郑州”  SELECT * FROM mytable WHREE username=”admin”

而下面几个则不会用到:

SELECT * FROM mytable WHREE age=20 AND city=”郑州”  SELECT * FROM mytable WHREE city=”郑州”

(5)建立索引的时机

到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:

SELECT t.Name  FROM mytable t LEFT JOIN mytable m    ON t.Name=m.username WHERE m.age=20 AND m.city=’郑州’ 此时就需要对city和age建立索引,由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。

刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:

SELECT * FROM mytable WHERE username like’admin%’ 而下句就不会使用:

SELECT * FROM mytable WHEREt Name like’%admin’ 因此,在使用LIKE时应注意以上的区别。

(6)索引的不足之处

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:

◆虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

◆建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

(7)使用索引的注意事项

使用索引时,有以下一些技巧和注意事项:

◆索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

◆使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

◆索引列排序

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

◆like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

◆不要在列上进行运算

select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成

select * from users where adddate<‘2007-01-01’;

◆不使用NOT IN和<>操作

以上,就对其中MySQL索引类型进行了介绍。

mysqli扩展库中有三个类库

mysqli()连接库

mysqli_result();结果集库

还有预处理库

mysqli使用构造方法连接

$mysqli=new mysqli(“localhost”,”root”,””,”数据库”);

var_dump($mysqli);

无论返回正确错误,都会返回一个对象

那么使用mysqli_connect_errno()函数去判断连接是否成功(连接的时候用)

使用mysqli_connect_error() 给出出错后的信息(连接的时候用)

这两个函数库都是mysqli扩展库里的

当执行sql语句时,如果出错可以使用

errno属性去得到错误号

error属性去得到错误信息

$mysqli->errno

$mysqli->error

如果 执行 插入insert 删除delete 更新update

就可以 使用 affected_rows属性去获取 改变的条数

返回数字
====================================================

<?php

$mysqli=@new mysqli(“localhost”,”root”,””,”brophp”);
 if(mysqli_connect_errno())
 {
  echo “数据库连接错误”.mysqli_connect_error();
    $mysqi=null;
    exit;
 }

 $sql=”insert into bro_user (id1,name,age,sex,email) values (”,’2222222′,’52’,’jdj’,’2222222′)”;
 $result=$mysqli->query($sql);
 if(!$result)
 {
  echo $mysqli->errno.”|”.$mysqli->error.”<br>”;//这是判断sql语句是否有误
  exit;
 }

if($mysqli->affected_rows > 0)//这是判断 增/删/改 影响的行数 ,可以知道sql语句是否执行成功

//例如 delete from bro_user where id <10 sql语句执行成功,但是数据表中id<10的数据不存在,那么

//$mysql->affecter_rows 依然返回 0 ,因为没对数据表有任何改变,自然行数就没发生变化  

{

echo “有行数被影响”;

}

echo “最好自动增长的ID:”.$mysqli->insert_id;//使用insert语句才有效,而且查询的字段设置了自动增长的属性

echo $mysql->affected_rows; 
 echo “数据库连接成功”;

?>

=======================================================

从PHP 5.0开始,不仅可以使用早期的mysql数据库扩展函数,而且还可以使用新的扩展mysqli技术实现与MySQL数据库的信息交流。PHP的 mysqli扩展被封装到一个类中,它是一种面向对象的技术,只能在PHP 5和MySQL 4.1(或更高的版本)环境中使用,(i)表示改进,其执行速度更快。使用mysqli扩展和传统的过程化方法相比更方便也更高效。利用mysqli扩展 技术不仅可以调用MySQL的存储过程、处理MySQL事务,而且还可以使访问数据库工作变得更加稳定。

喜欢过程化编程的用户也不用担心,mysqli也有过程式的方式,提供了一个传统的函数式接口,只不过开始贯以mysqli的前缀,其他都差不多。 如果mysqli以过程式的方式操作的话,有些函数必须指定资源,比如说 mysqli_query(资源标识,SQL语句)。并且资源标识的参数是放在前面的,而mysql_query(SQL语句,’可选’)的资源标识是放 在后面的,并且可以不指定,它默认是上一个打开的连接或资源。本书将重点介绍他的面向对象的用法,如果更喜欢以过程化方式编写程序,使用前面介绍的 mysql功能扩展模块就可以了。这里,希望读者使用面向对象的方式编程,这样可以编写出更容易阅读和理解的代码。

启用mysqli扩展模块

与mysql功能扩展模块类似,mysqli接口也不是PHP的一个集成组件,如果想使用这个功能扩展模块,需要显示配置PHP才能使用此扩展。在 不同平台下的配置有所不同,如果在Linux平台中启用mysqli扩展,必须在编译PHP时加上–with-mysqli选项。如果在Windows 平台中启用mysqli扩展,需要通过一个DLL文件提供相应的扩展。不管使用的是哪一个操作系统平台,都必须在php.ini文件里启用这个扩展,以确 保PHP能够找到所有必要的DLL。可以在php.ini文件中找到下面一行,取消前面的注释,如果没有找到就添加这样一行:

  1. extension=php_mysqli.dll              //在php.ini文件中启用这一行

关于配置PHP的更多信息,请参见本书第2章的环境安装。另外,可以在PHP脚本文件中,调用phpinfo()函数检查PHP版本是否支持mysqli接口。如果找到如图13-1所示的结果,则所用的PHP版本中支持mysqli接口。

图13-1  使用phpinfo()函数检查mysqli扩展模块的支持

mysqli 扩展不仅提供了mysql模块的所有功能,也相应地增加了一些新特性。mysqli扩展模块包括mysqli、mysqli_result和 mysqli_stmt三个类,通过这三个类的搭配使用,就可以连接MySQL数据库服务器和选择数据库、查询和获取数据,以及使用预处理语句简化了重复 执行的查询语句。

新项目中有个优化站,由于需要跟其他平台合作,帮助带来流量,那边做反向代理,需要自己网站的所有栏目以及内容都放到一个文件夹下,比如:/html/haha、/html/hehe/,都放到html文件夹下。问题就来了,我的栏目都是在根目录的所以只能在到后台改栏目的设置,哦嘎的:太多了只能批量改,操作如下:

织梦的,栏目地址和一些信息在dede_arctype中,栏目地址在dirtype这个字段里,sql语句如下

数据库内字段内容替换:

起因:最近新项目网站搬家到新服务器,感觉直接复制data下的文件比省事,所以就直接将data文件放到服务器对应的mysql下(一般linux中mysql的data文件在/var/lib/mysql/目录下)!

解决办法:由于项目新接手过来,不知道密码是多少,于是想直接在msyql命令里改一下密码,结果总是出现“ERROR 1036 (HY000): Table ‘ is read only”,这个鸟词(不明白啥意思),查了一下,就是因为这个mysql的文件权限问题,改吧(就按照其他正确的数据库权限来改),并且改完后需要重启mysql

再找到mysqladmin文件(应该在这个目录/usr/bin/mysqladmin)执行如下命令:

然后输入密码

ok

在到mysql命令下更改密码,没有问题!