优化MySQL数据库查询
在优化查询中,数据库应用(如MySQL)即意味着对工具的操作与使用。使用索引、使用EXPLAIN分析查询以及调整MySQL的内部配置可达到优化查询的目的
任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响。
如同其它学科,优化查询性能很大程度上决定于开发者的直觉。幸运的是,像MySQL这样的数据库自带有一些协助工具。本文简要讨论诸多工具之三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。
1: 使用索引
MySQL允许对数据库表进行索引,以此能迅速查找记录,而无需一开始就扫描整个表,由此显著地加快查询速度。每个表最多可以做到16个索引,此外MySQL还支持多列索引及全文检索。
给表添加一个索引非常简单,只需调用一个CREATE INDEX命令并为索引指定它的域即可。列表A给出了一个例子:
列表 A
mysql> CREATE INDEX idx_username ON users(username);
Query OK, 1 row affected (0.15 sec)
Records: 1 Duplicates: 0 Warnin ......
MySQL数据库root权限丢失解决方案
一天不小心把ROOT的权限改到最小了(只能登录,什么都做不了),这可急死我了.重装的话太麻烦,而且里面有很多的用户,一个个重新弄不知道到什么时候。
后来我想了一个办法,先把当前服务器的MySQL服务停止,把MySQL DATa目录下的mysql目录改名为mysql_OLD,到另一个服务器下把mysql目录下的/data/mysql目录复制到对应目录,然后启动MySQL服务,使用另一服务器下的root 的帐号登录到PHPmyadmin,进去之后可以看到有全部的操作权限了,但这个数据表中没有当前服务器中的数据库项目和用户信息。这时再找到mysql_OLD数据库,进去之后到user表,找到第一个 root localhost表段,修改:把所有的N改为Y。然后再停止mysql服务,把新复制过来的mysql删除,把mysql_old更名为mysql,再启动服务器后用root登录,发现权限已经全部回来了。 ......
前缀索引
(1)如果以多个字段作为索引(a,b,c)作为一个key,在查询时分根据匹配情况是否使用索引,所以,a/ a,b/ a,b,c这样的查询都能使用到,但是b,a/a,c/c,a等不符知前缀匹配就不能使用,所以在写sql时需要注意
(2)对于很长的字符串需要生成key时,可以找出最常使用的字符串的最常见前缀(前N个字条作为key,而不是将全个字符串作为key),这样一方面牺牲少少的精确性(有多余数据,再过滤),另一方面大大提高了检索效率,同时减少了索引的维护开销(存储空间,更新等)
如有200w的url,统计结果如下:
select count(*) as cnt, url from iUrl group by url order by cnt desc limit 10;
+-----+-------------------+
| cnt | url |
+-----+-------------------+
| 380 | http://www.f.com, |
| 354 | http://www.r.com, |
| 340 | http://www.h.com, |
| 336 | http://www.u.com, |
| 336 | http://www.e.com, |
| 336 | http://www.i.com, |
| 332 | http://www.k.com, |
| 330 | http://www.t.com, |
| 330 | http://www.w.com, |
| 326 | http://www ......
InnoDB,普通的mysql
dump备份下来,mysql恢复起来慢得要
死.
于是网上找了好久,才找到这么个工具
.
http://launchpad.net/percona-xtrabackup/release-1.2/release-1.2/+download/xtrabackup-1.2.tar.gz
先测试下再说.
可以这么备份:
MyISAM
表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false /--triggers
-R --hex-blob -x db_name > db_name.sql
Innodb
表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false /--triggers
-R --hex-blob --single-transaction db_name > db_name.sql ......
下面我给大家介绍几种在mysql数据库中修改root密码的方法
方法一:
原始密码是 ckh
mysql -uroot -pckh
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 5.0.22-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use mysql
Database changed
mysql> update user set password=password('newpass') where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
方法二:
原始密码是 newpass , 新密码是 mysql
mysqladmin -uroot -pnewpass password mysql
方法三
原始密码是 mysql , 新密码是 ckh
mysql -uroot -pmysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19 to server version: 5.0.22-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> set password for root@'localhost'=password('ckh ......
最近写了一个简单的Mysql操作类,拿出来和大家分享一下,还请各位高手指正一下析构函数的用法:
<?php
/*
* Created on 2010-5-25
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*
* class mysql
* made by S71ENCE
*/
class mysql
{
private $host;//主机名
private $name;//用户名
private $pwd;//密码
private $dataBase;//数据库名
private $coding;//编码
//初始化
function __construct($host,$name,$pwd,$dataBase,$coding)
{
$this->host=$host;
$this->name=$name;
$this->pwd=$pwd;
$this->dataBase=$dataBase;
& ......