MySQL常见问题

修改目录后MySQL无法启动

这种问题一般是selinux造成的
1、终端输入sestatus,如出现SELinux status: enabled,则selinux为开启状态,
2、编辑/etc/selinux/config 文件,将SELINUX=enforcing改为SELINUX=disabled,重启机器

修改密码

修改密码分为两种情况,一种情况是拥有原来密码,另外一种情况则是忘记密码

拥有原来的myql的root的密码;

方法一:

在mysql系统外,使用mysqladmin

# mysqladmin -u root -p password "test123"
Enter password: 【输入原来的密码】

方法二:

通过登录mysql系统,

# mysql -uroot -p
Enter password: 【输入原来的密码】
mysql>use mysql;
mysql> update user set password=password("test") where user='root';
mysql> flush privileges;
mysql> exit;      

忘记原来的myql的root的密码;

首先,你必须要有操作系统的root权限了。要是连系统的root权限都没有的话,先考虑root系统再走下面的步骤。
类似于安全模式登录系统,有人建议说是pkill mysql,但是我不建议哈。因为当你执行了这个命令后,会导致这样的状况:
/etc/init.d/mysqld status
mysqld dead but subsys locked
这样即使你是在安全模式下启动mysql都未必会有用的,所以一般是这样/etc/init.d/mysqld stop,如果你不幸先用了pkill,那么就start一下再stop咯。

# mysqld_safe --skip-grant-tables &

&,表示在后台运行,不再后台运行的话,就再打开一个终端咯。

# mysql
mysql> use mysql;
mysql> UPDATE user SET password=password("test123") WHERE user='root';   
mysql> flush privileges;
mysql> exit;                         

本来mysql是不分大小写的,但是这个是修改的mysql中的mysql数据库的具体的值,要注意到。

插入10万条记录的SQL

drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
val smallint unsigned not null default 0
)
engine=innodb;

drop procedure if exists load_foo_test_data;

delimiter #
create procedure load_foo_test_data()
begin

declare v_max int unsigned default 100000;
declare v_counter int unsigned default 0;

  truncate table foo;
  start transaction;
  while v_counter < v_max do
    insert into foo (val) values ( floor(0 + (rand() * 65535)) );
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call load_foo_test_data();

MySQL开启远程访问

  1. 选择mysql库,选user表 新增用户
mysql> insert into user(Host,User,Password) values('%','用户名(必须是英文数字)','密码');

刷新权限

mysql>flush privileges;
  1. 授权给新增的用户
mysql> Grant all privileges on *.* to '用户名'@'%' identified by '密码' with grant option;

注释:其中:“ . ”代表所有数据库和表(也就是root权限) 其格式为:数据库名称 . 表名
刷新权限

mysql>flush privileges;

数据库优化十个原则

  1. 尽量避免在列上进行计算,这样会导致索引失效
select * from t where year(d)>=2011   =>   select * from t where d>='2011-01-01';
  1. 使用join时,应该用小结果集驱动大结果集。同时把复杂的join查询拆分成多个query。因为join多个表时,可能导致更多的锁定和堵塞。
  2. 注意like模糊查询的使用,避免%%。
  3. 仅列出需要查询的字段,这对速度不会又明显的影响,主要考虑节省内存。
  4. 使用批量插入语句节省交互。
  5. limit的基数比较大时使用between。
  6. 不要使用rand函数获取多条随机记录。
  7. 避免使用null
  8. 不要使用count(id),而应该是count(*)
  9. 不要做所谓的排序操作,而应尽可能在索引中完成排序
  10. 适当使用联合索引,加快查询速度