给mysql数据表加索引的一次经验与体会.
昨天遇到一个问题:
在一张有三十万条纪录的数据表A,其主键自增字段id,name字段(varchar),还有type_id(int),在name字段上已经添加了索引。type_id由于是整型字段,认为加索引没有太多的意义,所以没有加索引。
本次有一个需求是在一个循环中按type_id查询此表A,结果一执行此循环,mySQL立刻占用CPU到200%以上,导致服务器响应极慢。
开始没想到是查询速度的问题,后来发现换一个表,CPU占用率立刻下降。于是分析了查询过询,发现每次查询都要遍历整表,所以数据库压力非常大。手工直接使用sql在数据库查询:
select * from A where type_id = xxxx
执行时间约为0.42s(400ms左右),速度较慢。
于是在type_id上添加索引,然后再执行同条语句。
执行时间为0.01s(10ms左右),速度明显提升(40倍左右)。
再执行循环,发现CPU占用8%左右,比较理想。
性能提升的原因分析:
type_id的值有特殊性:大部分type_id的值为0,索引效果明显。正好本次查询不需要查询type_id为0的纪录。如果要查询type_id为0的纪录,则效果提升可能不明显。
体会:
(1)在遇到查询性能的时候,适当的分析数据,添加索引,可能能大幅提高性能。
(2)是否添加索引,需要考量数据总量及数据更新频度再做决定。
(3)分析一条语句是否使用了索引。可使用 explain sql;
如explain select * from A where type_id = xxxx 会显示是否使用索引。
相关文档:
MySQL有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在MySQL启动的时候加入一些参数。
如果在my.cnf里面修改,需增加如下几行
long_query_time = 1
log-slow-queries =
log-queries-not-using-indexes
long_query_time 是指执行超过多久的sql会被log下来� ......
(1)mysql_connect(主机,用户名,口令);
返回一个连接号.
注意:mysql各用户的口令可以随该用户所在机器IP地址不同而改变. 另外,mSQL没有用户名机制,所以msql_connect只需要一个主机参数.主机可以是IP地址或域名.
(2)mysql_create_db(数据库名);
(3)mysql_select_db(数据库名,连接号);
连接一个数据库.
(4)mysql_q ......
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。
外键的使用条件:
1.两个表必须是
InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL
4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系� ......
今天看到一篇关于ubuntu下配置Apache+Mysql+PHP的文章,觉得很有用,加以自己的理解和编写,记录下来。
一、Apache的安装
Apache作为一个功能强大的Web程序,自然是架建Web服务器的首选,好了,下面我们就来安装Apache。在终端下输入下在面命令:
sudo apt-get i ......
最近因为忘了mysql的root密码,上网Google一下,现在把步骤记一下,防止以后忘了。
我用的是xampp软件包。
1. 停止mysql
2. 打开cmd,切换目录到 \xampp\mysql\bin, 运行
mysqld -skip-grant-tables
这条命令是跳过权限检查启动mysql服务
3. 打开另一个cmd,同样切换目 ......