Wednesday, January 30, 2008

Partitioning a Powerful Tool for DBAs

Partitioning tables and indexes in a database is one of the most powerful features that can help the performance and manageability of a database with large tables. With a large database, there are usually only a handful of very large tables. These large tables typically get most of the I/O activity and have the biggest impact on performance and management.

Partitioning tables and indexes breaks a big problem (large tables) into a number of smaller manageable pieces (table partitions). When a table is partitioned, it is broken into separate physical chunks of data (partitions). For example, there is a large sales table with 10 million records. When generating a monthly or quarterly report, enough records are accessed so an index scan is not efficient, so a full table scan has to be performed. So every month more records get added to the table and every month the monthly report takes longer to run because it is generating a full table scan to go through the data.

An example of how partitioning can have an impact: a sales table can be divided into partitions (i.e. monthly increments) based on the sales date (partition key). So one table partition will have January's data, another partition can have February's data and so on. When a monthly report is generated, an I/O scan will occur on one month of data instead of the entire table. The table partitioning is transparent to the applications. While processing the SQL statement, the optimizer understands the table is partitioned and checks to see if individual partitions can be scanned instead of the entire table.

Partition Pruning
Partition pruning allows a query to run on specific partitions instead of an entire table. Leveraging this benefit requires understanding the data and how the data is accessed to determine the best partitioning method and what column(s) should be the partition key. The partition key is the column(s) used to divide the data into separate partitions. Sufficient time needs to be spent determining the correct column(s) to define as the partition key and defining the correct partition type for the table.

Partitioning offers a number of advantages:
  • Partition pruning allows I/O to be performed on smaller data sets instead of the entire table. As tables grow larger, it can be a big advantage to perform partition scans.
  • Being able to perform administration operations at the partition level versus the table level. This can decrease maintenance times and improve availability.
  • Partitioning is transparent at the application level. Applications (SQL and stored procedure code) will not be impacted by going to a partitioning solution. The optimizer will consider partition pruning (selecting individual partitions) during the optimization phase of processing a SQL command if the partition key column(s) is used in the WHERE clause.
  • Supports information lifecycle management so as data gets older it can be truncated or deleted in older partitions and not impact the more current partitions.
  • Partitioning on indexes breaks one big index into smaller indexes which can significantly reduce I/O on the indexes.
Some examples of using partitioning:
Here are two examples where partitioning can have a positive impact.
  1. A key transaction table is expected to grow by 30% over the next year. It may not be acceptable for the I/O performance to decrease as more data is added to a table. Being able to internally break a table into separate chunks of data that contain data for an individual month or region can offer significant advantages. Monthly reports or regional reports can perform partition scans on specific months or regions and not have to perform full table scans.
  2. A table needs to store data for 13 months. Every month when the oldest partition expires it can be truncated instead of going through and deleting all the old records that have expired.
Different types of partitioning
Range or list partitioning is good to use when there are recognized patterns for how the data is accessed or organizing the data into defined data sets makes sense from an administration perspective. Hash and key partitioning is good to use when someone is just as likely to access one record as another or there is not a clear recognized way to divide the data but there are so many records in a table the benefits of partitioning can be leveraged.
* Composite partitioning- RANGE AND LIST partitions can be sub-partitioned by HASH or KEY.

Code examples:
In this example, we have selected the sdate column as the partition key. The table will be broken into separate data chunks (partitions) based on the VALUES LESS THAN clause. Here we have stated that all data before January 1, 2008 will go in the first partition. Partition ranges are not inclusive. Which means Partition Jan2008 will store records where the sdate value is 2008-01-01 or greater and less than 2008-02-01. For 2008 the data is broken into monthly increments. The partition key is defined by the columns listed in the partition clause. The values in the partition key columns determine which partitions the records will be put in.

Range Example:
Range partition example has one partition for dates before 2008 and monthly partitions after that. The MAXVALUE keyword will accept any records with a sales date that is 2008-04-01 or greater. Once we get into May, a new partition for the new month can be created.
region_id INT (3),
cust_id INT,
INDEX ( invoice_id),
INDEX ( sdate) ) ENGINE=innodb
PARTITION BY RANGE (to_days(sdate)) (
PARTITION before2008 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION Jan2008 VALUES LESS THAN (to_days('2008-02-01')) ,
PARTITION Feb2008 VALUES LESS THAN (to_days('2008-03-01')) ,
PARTITION Mar2008 VALUES LESS THAN (to_days('2008-04-01')) ,

List Example:
List partition example partitions based on the region_id column. The value for the region_id will determine which partition the data goes into.
region_id INT (3),
cust_id INT,
INDEX ( invoice_id),
INDEX ( region_id) ) ENGINE=myisam
PARTITION BY LIST (region_id) (
PARTITION North VALUES IN (1, 2, 5, 6),
PARTITION South VALUES IN (7,8,15,16 ),
PARTITION West VALUES IN (20, 21, 22, 23, 24),
PARTITION East VALUES IN (30, 31, 32, 34, 35) );

Hash example:
Hash table example generates 16 partitions that will be used to try and evenly divide the data. Hash partitioning uses the modulus operator to distribute the data.
CREATE TABLE download(
pname VARCHAR(60),
pcode INT,
region_id INT ) ENGINE=myisam

Key partition example:
Key table table breaks the data into 16 partitions. With key partitioning, the MySQL server will use an internal algorithm to try to evenly distribute the data.
CREATE TABLE download(
pname VARCHAR(60),
pcode INT,
region_id INT ) ENGINE=innodb

Composite Partitioning
If the number of records that go into a range or list partition are still too too big, then a composite partitioning can be performed. Range or list partitioned tables can have a lower level of partitioning performed. This is called sub partitioning.

RANGE-HASH partitioning
This RANGE-HASH partitioning will have four has subpartitions for every range.
region_id INT (3),
cust_id INT,
INDEX ( invoice_id),
INDEX ( sdate) ) ENGINE=innodb
PARTITION BY RANGE (to_days(sdate))
PARTITION before2008 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION Jan2008 VALUES LESS THAN (to_days('2008-02-01')) ,
PARTITION Feb2008 VALUES LESS THAN (to_days('2008-03-01')) ,
PARTITION Mar2008 VALUES LESS THAN (to_days('2008-04-01')) ,

This RANGE-HASH partition table defines the number of subpartitions to be defined for each range. Different numbers of subpartitions can be defined when different months can have different volumes of sales. So it may be necesssary for some some ranges to have a larger or smaller number of partitions.

region_id INT (3),
cust_id INT,
INDEX ( invoice_id),
INDEX ( sdate) ) ENGINE=innodb
PARTITION BY RANGE (to_days(sdate))
PARTITION before2008 VALUES LESS THAN (to_days('2008-01-01'))
PARTITION Jan2008 VALUES LESS THAN (to_days('2008-02-01'))
PARTITION Feb2008 VALUES LESS THAN (to_days('2008-03-01'))
PARTITION Mar2008 VALUES LESS THAN (to_days('2008-04-01'))

To leverage partition pruning, the partition key column (sdate) needs to be in a WHERE clause, for the optimizer to consider performing partition scans. For example, the following query will only access data that is in the Jan2008 instead of the full table. So if we use the partition key in the WHERE clause then monthly and quarterly reports will perform partition scans and not full table scans.

WHERE sdate BETWEEN '2008-01-01' AND '2008-01-01';

A few points about partitioning in MySQL 5.1
This is the first release of partitioning in MySQL so the focus is on key features of partitioning. It's a little tough due to some of the restrictions (listed below) but they are offset by the fact that MySQL offers partitioning for free. This can be an expensive license for other database vendors. This allows MySQL users the ability to leverage the great benefits of partitioning without any additional licensing costs.

People always ask me how big should a table be before we start considering partitioning. I then give my favorite answer, "it depends". Once a table gets to the size that the following become issues, it is time to consider partitioning:
  • Full tables scans are too expense.
  • Maintenance operations on an entire table take too long.
  • Availability is being impacted by the table being too large.
  • ILM can be leveraged by going to partitioning.

Some restrictions of using partitioning in MySQL 5.1
  • Partitioned tables must be partitioned on the partition key using an integer or must contain an expression that evaluates to an integer expression (key partitioning is an exception to this). Partition pruning can still be performed on date columns if you use the TO_DAYS() or YEAR() functions.
  • There can be a maximum of 1024 partitions.
  • Foreign keys are not supported.
  • If a table contains a primary key, the columns in the partition key must be part of the primary key.

Monday, January 28, 2008

Don't Underestimate MySQL

A lot of the popularity of MySQL is its ease of installation and how easy it is to use out of the box. Anyone can install MySQL pretty easily. That is the danger of MySQL. Because MySQL is so easy to install, people can forget or not realize that MySQL is a full blown database server. MySQL:
  • Needs to be installed properly.
  • Needs to be tuned like any other database server the more it is used.
  • Proper management practices need to be put in place.
I've taught the Oracle 10g DBA Workshop I and the MySQL Database Administration classes. I will tell you that the MySQL DBA class is every bit as technical and complex as the Oracle DBA class. The point is there is a lot to learn about MySQL if you are going to use it in a production environment. As a MySQL DBA you are going to have to configure, tune and manage MySQL as a database server similar to how other database servers are managed. MySQL's performance, scalablity, security and ease of administration are dependent on how MySQL is configured.

The most common mistake I see among DBAs that come from other database vendor environments is that they underestimate how much MySQL can be configured and that its architecture and tools are different than other databases. Storage engines, sql modes, MySQL memory caches and buffers, SQL and PL/SQL processing, replication, etc. all need to be understood to maximize how MySQL can be used. Even the hardware purchases are different in a MySQL environment.

MySQL is growing in popularity as an enterprise solution. So if you are an Oracle, SQL Server, DB2, Sybase, Informix DBA, do not underestimate how much you can do with MySQL. If you are going to manage MySQL databases in a production environment you should be taking the DBA, Performance Tuning and High Availability classes to learn the core fundamentals of MySQL.

Monday, January 21, 2008

Stored Procedures in MySQL

Stored procedures were introduced in the MySQL database server in version 5.0. It has been interesting to see the growth of stored procedures in the MySQL community because it is completely different with how stored procedures grew in the Oracle community.

Stored Procedures in Oracle
Stored procedures were introduced in Oracle 7, back in the client/server glory days. DBAs and developers using Oracle Forms and Reports seen the immediate benefit of using stored procedures in the database and PL/SQL stored procedures became very popular. A large part of this was due to developers considered themselves "database developers" so they tried to always leverage the features in the database. The PL/SQL language has grown through all the releases of Oracle and now in Oracle 11g Database Server, PL/SQL is still extremely popular and experienced Oracle DBAs and developers find tremendous benefits in writing stored procedures.

Stored Procedures in MySQL
I have not seen a great adoption of stored procedures in MySQL. I believe one of the reasons is due to the community of developers writing code for MySQL and open source applications. The core developers who write applications for MySQL are using Perl, Python, Ruby on Rails and PHP. They think first of how to write applications leveraging the benefits of the language they are working with and not the database. They write feature and GUI rich applications that run in the middle tier. So it is not natural for most of they to look and leverage the features in the MySQL database server. As web applications grow larger and access larger data sets this approach can effect performance as applications grow popular.

Remember the Wisdom of the Ancient Ones
If you study history or watch the history channel you are probably aware that long time ago, there were a group of ancient ones who had acquired great knowledge that has slowly been lost through the ages. They were called the Main Framers. One of the core beliefs of these ancient ones was that the closer you put your applications to the data the faster they run if they are data intensive. Slowly with the growth of client/server and then multi-tiered applications, this great wisdom has been slowly forgotten over time. There are new generations of developers who now even question if the people known as the Main Framers even really existed or if it is a myth.

The Benefits of using Stored Procedures
When writing data intensive algorithms, the most efficient place to run this code is in the database server. Runtime environments leverage the execution of the application code, not the database code. It does not make sense to access data, send it across the network, then filter and massage it in the middle tier application code. It is best to run this data intensive code in the database server, filter it and massage it in the database server and send what needs to be displayed to the middle tier. This approach will reduce network traffic and leverage what the database server and the middle tier each do best.

Growth of Stored Procedures in MySQL
Version 5 of MySQL introduced stored procedures with basic functionality. In version 6 of MySQL and future releases you can expect to see a lot of enhancements that will continue to leverage running data intensive code in the database server.

It would be wise for open source developers to look at how they can filter and massage data in the database server and send to the middle tier only the data they need to process and display for their application.

MySQL - A change agent for open source

The 1st Edition of "The MySQL Story" was handed out during the MySQL meeting in Orlando when the Sun acquisition of MySQL was announced. MySQL is a very cool company with employees that have a very unique, committed and passionate perspective to open source.

MySQL employees are taught to be "disruptive", to shake the world with new ideas and innovativeness. With a strong believe and commitment to open source, MySQL AB has created a company where everyone believes that there is a greater good that can be accomplished by working together, collaborating together, sharing and freely exchanging ideas. I believe a lot of the great company "team" attitude and commitment to work together is fostered by the belief in open source.

If Sun truly wants the MySQL acquisition to succeed, I strongly recommend Sun to let the core values of MySQL to survive and to try not to change MySQL but to support MySQL so the MySQL database server can grow better and stronger and help open reach new levels of success. Open success succeeding is a win for every individual and startup company on the Internet.

I find it interesting all the doomsayers predicting all the things that could go wrong with this MySQL acquisition and can MySQL go head to head with Oracle. You always hear this from the industry analysts never from MySQL employees. Oracle is like an aircraft carrier task force and MySQL is like a small speed boat. All MySQL employees know this and love MySQL being a speed boat. All the doom sayers and preachers of gloom need to relax a little bit or maybe that helps get readers. Open source believers believe in "open source". They are not religious zealots for Ruby on Rails, PHP, MySQL, Linux or any other component of open source. They are committed to open source. MySQL understands as well as any, open source group. I can't predict the future, you will always see MySQL at the front of the battle lines for open source. I suggest everybody sit and wait to see how the MySQL database server grows under this acquisition. You don't kill the goose that lies the golden eggs. Be a little patient, you may be pleasantly surprised with how well this acquisition goes.

MySQL employees have the opportunity to be a "Tipping Point" for open source. MySQL employees are currently at the tip of the blade not the bleeding edge. Their vision can be a tremendous change agent for the IT industry. If the MySQL people focus on being great leaders and help define future directions of open source and continue to build new versions of the database open source can count on, then all will be good in the world of open source. Everyone on the Internet: Internet companies such as Google, Yahoo, YouTube, MySpace, bloggers, startup companies, individuals building their first website, hosting companies should all be rooting for the Sun acquisition of MySQL to be successful.

Friday, January 18, 2008

Database, Application and Middleware Wars

The changing dynamics of the IT industry is going to increase in the next year versus slowing down.
  • Oracle's acquisitions in the last few years in the middleware space has the potential to significantly increase it's power to challenge IBM in the middleware space.
  • Oracle's acquisitions in the application space the last few years allows Oracle to go toe to toe with SAP in the business applications space.
  • Sun's backing and support brings a lot of power to MySQL and the web platform of LAMP.
  • The open source world and Internet are changing how people think daily.
  • The innovativeness of the world wide web is creating new companies at an unbelievable rate. The creativity of this space is going to change the world in ways we can't even imagine.
I almost see this as Oracle having two big aircraft carrier task groups one facing IBM and the other facing SAP. MySQL is like a very fast attack boat that now has a powerful nuclear submarine flying the Sun flag to protect it. Microsoft is another big aircraft carrier task group that everybody is wondering where it is going. The database, application and middleware battles that will occur over the next year is sure to change the face of the IT industry more than we can possibly imagine. This does not even include all the Internet companies like Google, MySpace, YouTube and others that are changing the world everytime we blink. Or maybe more importantly all the new little startups on the Internet that are being born every day.

I look at this like back in the day when DEC was the second largest computer company in the world and everyone was wondering if they could catch IBM. If back then you had said that in the future a PC company is going to purchase DEC, people would have thought you were crazy. I have the great luxury of traveling in the Oracle and open source worlds. In the Oracle world, I see the incredible power Oracle technology brings to large companies that have complex problems to solve. In the open source world my mind is literally boggled every week with all the incredible, incredible creativity and innovativeness that I see in Internet companies. If you look around everyone can see that rate of change in the world is accelerating. The Internet is spawning new change agents in the world at an exponential rate.

Thursday, January 17, 2008

Open Source continuing to change the world

MySQL by the pure volume of downloads is considered the most popular database for the Internet. MySQL and open source are changing the world as well. The first .com explosion had startup companies throwing a lot of money at traditional hardware and proprietary software. While today, most start ups are running open source solutions like MySQL, Linux, Apache, Perl/PHP, etc. This allows startup companies to have more operational flexibility in their beginning stages. This significantly reduces the startup capital to build the IT infrastructure. By this definition MySQL and open source are helping fuel the world wide economy by allowing companies to have enterprise Internet platforms out of the gate.

In the last year a number of small and medium sized companies have started using MySQL on projects. With everyone seeing the tremendous success of MySQL in companies like Google and YouTube, you can expect more large companies looking for projects where MySQL is a good fit. With Sun fueling MySQL (solar powered), this should significantly increase the growth of MySQL in the database market. 2008 can expect to see a significant acceleration of open source in the industry.

Sun has to feel good that they have JavaDB which plays well for smaller databases and now MySQL.

Wednesday, January 16, 2008

The Dolphin in the Net, a Great Catch!

The Dolphin in the Net, a Great Catch!
Only time will tell, but Sun Microsystems (who said "the NETwork is the computer") was able to capture the dolphin. Sakila the dolphin is the MySQL mascot. Sakila represents power, speed, grace, precision, friendliness and good nature. I believe the open source community would want Sun to help maximize these characteristics and not turn it into a whale. This may turn out to be one of Sun's best acquisitions in a long time. It's interesting that most people think dolphins all look the same and that replication is one of MySQL's most popular features.

Any good relationship is based on both sides bringing something positive to the table and hopefully each side has positive assets that can counter possible weaknesses in the other. The MySQL acquistion by Sun brings together some strong benefits and assets. Some of the top potential benefits that stand out to me include the capability of making the whole greater than the sum of the parts:
  • MySQL engineers working with Sun engineers is sure to bring new new innovation and strength to the MySQL database server.
  • Sun support, logistics, distribution channels, financial backing definitely will open a lot of doors to big customers for MySQL.
  • The one million plus active instances in the world have the potential of bringing a lot of new customers to Sun.
  • MySQL's disruptive perspective that creates create innovation and ideas in the open source world has a chance to change Sun's culture.
MySQL's popular open source database could have been purchased by Oracle, Red Hat, HP, IBM or a number of other big companies but Sun may have the most synergy with MySQL. One of MySQL's great assets is its relationship with the open source community. It will be very interesting from an IT industry perspective to see how this new relationship evolves. From a strategic perspective, Sun's capture of the dolphin may be one of the great catches of the year.

I would highly recommend reading Jonathan Schwartz's blog at

Sun to Acquire MySQL - LAMP + MARS

Sun Microsystems Announces Agreement to Purchase MySQL

Today, January 16, 2008 Sun Microsystems, Inc. announces it has entered into an agreement to purchase MySQL AB. Sun's distribution channels and support is definitely going to accelerate the growth of MySQL in the database market. MySQL has over 50,000 copies downloaded daily with an estimated total downloads of over 100 million is already the fastest growing database in the Internet market. Combining MySQL with Sun is sure to increase the growth and incredible popularity MySQL is currently encountering. The purchase is for 1 billion dollars, 800 million in cash and 200 million in options. After the announcement Sun stock is up by 10% which is an increase of about 1 billion dollars. Everything is relative. :) The pending purchase is going to be the largest financial transaction for open source. Despite this being an important day for open source, this is just the tip of the iceberg in terms of where open source is going.

Sun and MySQL - A Change Agent
Sun's emphasis on meritocracy and MySQL's focus on egalitarianism is sure to bring new innovativeness and ingenuity to the Internet market. The Sun and MySQL cultures have a lot of similarity and this combination is sure to be a change agent. Sun helped change the IT world and replaced Digital Equipment Corporation and forced HP and IBM to change their positions on large big computers being replaced by small powerful computers. MySQL is continuing to change the IT world by providing a strong open source database and has forced proprietary database companies like Oracle, IBM and Microsoft to address the growing popularity of MySQL and open source. Sun currently plays a large role in the server and Java worlds will now play a larger role in IT nfrastructures.

MySQL Key Component of Web Platform
The MySQL database is a key component of the web platform along with the LAMP software platform of Linux, Apache, MySQL/memcached and PHP/Perl. With Sun including OpenSolaris, OpenOffice, GlassFish, Java, and NetBeans this is going to increase the power of the web platform that both Sun and MySQL play a key role in. MARS is the MySQL, Apache, Ruby on Rails and Solaris platform. Sun and MySQL have been two of the most innovation companies in the web software platform for the Internet. The combination of MySQL and Sun is sure to help take the web platform to new levels which will benefit large organizations as well as small individual companies.

The Toy Revolution is Here!
In the past, some proprietary companies have tried to address the incredible explosion of MySQL's popularity by saying it was a "toy". As stated today, the world had better prepare for the Toy Revolution! Acquisitions today are very dynamic and changing the world. Apple's purchase of Next brought tremendous innovation and creativity to Apple which spearheaded the growth of Apple. Sun's purchase of MySQL has the potential to bring a tremendous amount of new creativity, energy and dynamics to Sun Microsystems.

Thursday, January 10, 2008

Excellent Open Source Presentations

Last night I went to some presentations that were put on by the Chicago chapter of ACM. The two presentations were:

  • An Introduction to Bloom Filters - This presentation focused on choosing the best algorithm to solve a problem. The most familiar trade-off is between storage space and time, but there are more exotic possibilities that can lead to data structures with surprising properties. This presentation discussed Bloom Filters, a probabilistic data structure that efficiently encodes set membership and allows a trade-off between storage space and uncertainty. It was an excellent presentation on how to achieve very high scalabliity with inexpensive hardware using open source.
  • How Open Source Projects Survive Poisonous People -Every open source project runs into people who are selfish, uncooperative, and disrespectful. These people can silently poison the atmosphere of a happy developer community. Come learn how to identify these people and peacefully de-fuse them before they derail your project. Told through a series of (often amusing) real-life anecdotes and experiences.
These were two absolutely outstanding presentations. The second one was probably the best presentation I've seen in years. Both presentations had tremendous take aways. I would highly recommend attending both of these presentations if they are given again (they will be the audience was asking the presenters if they would give it again at different locations). If this is the type of presentation given at the Chicago ACM chapter I would highly recommend attending a meeting of this organization in the future.

Wednesday, January 2, 2008

2007 - MySQL a Year in Review

2007 has been an interesting year with MySQL. MySQL really seems to have broken out this year. Organizations are absolutely choking on their database and software licensing costs. More and more organizations, large and small are now recognizing MySQL databases as a viable solution for database projects.

If MySQL can be a solution for a database project, it can provide a lot of flexibility for organizations. Leading managers are looking at more ways to be competitive in today's global markets. A number of the largest Internet websites are using MySQL to provide extremely fast reliable Internet solutions. These success stories have more IT managers asking what MySQL can do for them. A great success story can be found at:

In 2007, more than any year open source solutions have taken an exponential leap in use and acceptance in the market place. In the last year I've gone into some of the largest companies in the U.S. and seen an explosion of MySQL databases. In 2008, I expect to see the growth of open source solutions increase in use and acceptance. My top three reasons I see a significant increase in MySQL databases for 2008:
  1. IT managers beginning to think out of the box and realizing how open source can offer greater flexibility in choosing software solutions.
  2. Industry acceptance of open source solutions in the enterprise.
  3. Popularity of MySQL version 5 features.
The large vendors can no longer ignore the growing popularity of open source and MySQL. 2007 has seen large vendor companies purchasing open source products. It's funny, I've seen a few blogs predict gloom and doom for MySQL because Oracle purchased InnoDB and IBM purchased SolidDB. I see the exact opposite. The purchases of popular storage engines used by MySQL shows the growing popularity and use of MySQL can not be ignored by large vendor companies. Their purchases bring more light and industry awareness of popular storage engines used by MySQL.

I predict InnoDB and SolidDB storage engines will be used more than ever in MySQL databases. As MySQL 6.0 moves towards GA, you will see the Falcon storage engine increase in interest and popularity with it being the next generation in transactional storage engines for MySQL.

The growth of open source is going to be very interesting to watch in 2008. As Oracle, Microsoft and IBM, BEA, etc. add more and more features to their products and increase their prices, open source products grow in popularity and marketshare at almost the same pace. The growth of MySpace, YouTube, MySQL, etc. is continuing to demonstrate the incredible dynamics of the Internet and how the use of open source is continuing to change our IT industry. I don't work with all open source products but the following are products I work with and see them becoming more popular than ever before. Popular open source solutions that I predict will continue to grow in 2008 include:
  • MySQL
  • Apache
  • Apache Tomcat
  • JBoss
  • Eclipse
  • Spring